十大经典排序算法之快速排序
近些日子突然想回顾下十大经典排序算法,于是就找空余时间用c语言实现一下,就当是回顾和复习了,今天我们就来讲讲快速排序算法
快速排序算法是十大经典排序算法其中的一个,其思想主要就是将一组没有顺序的数字,首先在这组数字里先找一个数字作为基准数,一般地都会用这组数字的第一个数或者最后一个数作为基准数。在这里我们选择这组数据的第一个数作为基准数。然后设置两个游标,我们将前游标指向第一个数,然后我们将后游标指向这组数据的最后一个数。然后从后游标往左,当找到比基准数字小的数字的时候,我们就将这个数和前游标指向的数字交换,然后前游标自增(加一,或者说前游标向后移动一位)。然后我们从前游标开始往右找,当找到比基准数字大的数的时候,我们就将这个数和后游标目前所指的数字进行交换。然后后游标自减(减一,或者说后游标向前移动一位)。然后重复上述步骤,直到后游标等于前游标的时候,此次排序结束。
但是,要注意的是,上述排序的过程,只是将比基准数小的放在了基准数字左边,比基准数字大的,放在了基准数字右边,所以要想完全的将这组数据排序完成。我们还需要进一步排序,其实在上面我们就将数组划分成两个部分,一个部分比基准数字小的,一个部分是比基准数字大的,所以我们接下来只需要对这两个部分进行再次排序就行了,将左边的部分再次划分成两部分,直到最后不能继续划分,此时排序完成。说了这么多,可能有的同学还是不太理解,我们画个简单的示意图来辅助大家理解,如下图:
1 /* 2 经典排序算法:快速排序算法的c语言实现 3 */ 4 #include<stdio.h> 5 #include<stdlib.h> 6 //展示数组元素的函数 7 void display(int a[],int len){ 8 int i = 0; 9 while(i<len){ 10 printf("%d ",a[i++]); 11 } 12 printf("\n"); 13 } 14 15 //交换两个数的函数 16 void swap(int *first,int *second){ 17 int temp; 18 temp = *first; 19 *first = *second; 20 *second = temp; 21 } 22 23 //将数组元素划分成两个部分,比基准元素大的和比基准元素小的 24 int sort(int a[],int start,int end){ 25 int standard = a[start]; 26 int low = start; 27 int high = end; 28 while(low<high){ 29 while(low<high && a[high]>=standard){ 30 high--; 31 } 32 33 if(low<high){ 34 swap(&a[low],&a[high]); 35 low++; 36 } 37 38 while(low<high && a[low]<=standard){ 39 low++; 40 } 41 42 if(low<high){ 43 swap(&a[low],&a[high]); 44 high--; 45 } 46 } 47 a[low] = standard; 48 return low; 49 } 50 51 //快速排序函数 52 void quickSort(int a[],int start,int end){ 53 if(start<end){ 54 int pos = sort(a,start,end); 55 quickSort(a,start,pos-1);//递归调用 56 quickSort(a,pos+1,end);//递归调用 57 } 58 } 59 int main(void){ 60 int len = 0; 61 int *p; 62 int i; 63 printf("请输入排序的数组长度:\n"); 64 scanf("%d",&len); 65 getchar();//读走输入流的回车字符 66 p = (int *)malloc(sizeof(int)*len); 67 printf("请输入排序的数字:\n"); 68 for(i = 0;i<len;i++){ 69 scanf("%d",&p[i]); 70 } 71 printf("排序前的数组:\n"); 72 display(p,len); 73 quickSort(p,0,len-1); 74 printf("排序后的数组:\n"); 75 display(p,len); 76 free(p); //释放内存 77 return 0; 78 }