十大经典排序算法之快速排序

一个人想着一个人 提交于 2019-12-01 07:59:08

十大经典排序算法之快速排序

近些日子突然想回顾下十大经典排序算法,于是就找空余时间用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 }

 

 

      简单介绍下上述代码,display函数形参有两个一个是整形数组,一个是数组的长度,这个函数的功能是将数组里的元素输出到控制台上。swap函数的功能就是交换两个数字的值。然后就是sort函数,将数组元素划分成两个部分,一个部分是比基准元素要小的部分,另外一个部分是比基准元素要大的部分。而在quickSort函数里,我们调用sort函数从而得到我们划分好了的基准元素所在的下标,然后以这个下标为界,将前面一部分数据再进行排序,后面一部分数据再进行排序直到结束。
      下面给出代码运行结果:


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!