#排序算法#【4】快速排序

  快速排序法是对冒泡排序的一种改进,本来是要和冒泡排序写在一个文章里的,不过前两天刚开始在递归调用的时候没有完全理解,昨天晚上google了一把发现原来自己理解错了,我看的这个教材没有写清楚,今天早上调试了一把终于成功。

  快速排序算法的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

  

  快速排序使用分治策略来把待排序数据序列分为两个子序列,具体步骤为:

    (1)从数列中挑出一个元素,称该元素为“基准”。

    (2)扫描一遍数列,将所有比“基准”小的元素排在基准前面,所有比“基准”大的元素排在基准后面。

    (3)通过递归,将各子序列划分为更小的序列,直到把小于基准值元素的子数列和大于基准值元素的子数列排序。

     

 

    上图中只是以69为基准数的两个步骤的图示,其实一遍下来以后,应该是比69小的都排在它左边,比69大的都排在它的右边。

    贴上一张在万能的百度中找到的关于快速排序的动画图,可能稍微好理解一些:

      

 

具体代码如下:

 1 #include <stdio.h>
 2 #include "CreateData.c"  //生成随机数文件
 3 
 4 #define MAXSIZE 10
 5 
 6 //快速排序分割出基准数下标
 7 int Partition(int a[],int left,int right){
 8     int base;
 9     base = a[left];
10     while(left < right){
11         while(a[right]>base && left<right)    //右边的数大于基准数
12             right--;
13         a[left] = a[right];
14 
15         while(a[left]<base && left<right)
16             left++;
17         a[right] = a[left];
18     }
19 
20     a[left] = base;        //保存基准数
21 
22     return left;
23 }
24 
25 //快速排序算法实现
26 void QuickSort(int a[],int left,int right){
27     int i;
28 
29     if(left < right){
30         i = Partition(a,left,right);
31 
32         QuickSort(a,left,i-1);
33         QuickSort(a,i+1,right);
34     }
35 }
36 
37 int main(){
38     int a[MAXSIZE];
39     int i;
40 
41     if(!CreateData(a,100,10,MAXSIZE)){
42         printf("生成随机数失败\n");
43         return 0;
44     }
45 
46     printf("排序前:");
47     for(i = 0 ; i<MAXSIZE ;i++)
48         printf("%d ",a[i]);
49 
50     QuickSort(a,0,MAXSIZE-1);    
51     
52     printf("\n排序后:");
53     for(i = 0 ; i<MAXSIZE ;i++)
54         printf("%d ",a[i]);
55 
56     return 1;
57 }

 

时间复杂度:O(n*lgn)
最坏:O(n^2)
空间复杂度:O(n*lgn)

快速排序对包含n个数的输入数组,平均时间为O(nlgn),最坏情况是O(n^2)。
通常是用于排序的最佳选择。因为,基于比较的排序,最快也只能达到O(nlgn)。

posted @ 2014-05-31 18:41  非著名程序师  阅读(482)  评论(0编辑  收藏  举报