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

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

近些日子突然想回顾下十大经典排序算法,于是就找空余时间用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函数从而得到我们划分好了的基准元素所在的下标,然后以这个下标为界,将前面一部分数据再进行排序,后面一部分数据再进行排序直到结束。
      下面给出代码运行结果:

猜你喜欢

转载自www.cnblogs.com/ybxfighting/p/11671449.html