常见排序算法(冒泡,选择,快速)的常见排序算法(冒泡,选择,快速)的C语言实现语言实现
要实现这几种算法的关键是要熟悉算法的思想。冒泡排序,每经过一轮排序,将最大的数沉到最底部。选择排
序的思想是将整个数列,分为有序区和无序区。每轮排序,将无序区里的最小数移入到有序区。快速排序的思
想是以一个数为中心,通常这个数是该数列第一个数,将整个数列分为两个部分,一个部分是大于这个数的区
域,一个部分是小于这个数的区域。然后再对这两个部分的数列分别排序。
从这几个简单的排序算法上看,有几个特点:
冒泡排序是最简单的,也是最稳定的算法。
选择排序不太稳定,但是效率上较冒泡还是有较大的提升。其实在分析的过程中就能发现,选择排序和冒泡排序相比,中间少
了很多的交换过程,和比较的次数,这个应该是时间较少的原因。选择排序能够满足一般的使用。当比较的数超过以万为单位
时,选择排序也还是要一点时间的。
快速排序据说是最快的。这个可以从思想上看的出来。,当记录较多的时候,快速排序的比较循环次数比上面2个都要少。但
是在具体的实现过程中,并不见得如此。这是因为递归效率的低下导致的。当然,估计在实际使用过的过程,快速排序估计都
会使用非递归操作栈的方式来实现。那样应该会效率高伤不少。估计我会在后期出一个快速排序的非递归实现来真正比较它们
3个性能。在下面的程序中,可以通过调高N的数字就能看的出来冒泡排序和选择排序性能的差异。在N较小,大概几百的时
候,是看不出来的。N较大的的时候,比如N=1000或者N=10000的时候,快速排序的递归实现就会卡死在那里了,出不了结
果。
以下是具体的代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define N 10
#define Demo 1
voidBubbleSort(intarr[],intn);
voidSelectSort(intarr[],intn);
voidQuickSort(intarr[],intn);
voidPrintArray(intarr[],intn);
voidGenerateArray(intarr[],intn);
intmain(intargc,char*argv[])
{
intarr[N];
GenerateArray(arr, N);
#ifDemo
printf("Before the bubble sort------------------------");
PrintArray(arr, N);
#endif
printf("Start Bubble sort----------------------");
clock_t start_time1=clock();//开始计时
BubbleSort(arr, N);
clock_t end_time1=clock();// 结束计时
printf("Running time is: %lf ms\n", (double)(end_time1-start_time1)/CLOCKS_PER_SEC*1000);//输出运行时间