码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-06-02 21:03:57      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   blog   code   java   

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

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

  

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

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

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

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

     bubuko.com,布布扣

 

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

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

      bubuko.com,布布扣

 

具体代码如下:

bubuko.com,布布扣
 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 }
bubuko.com,布布扣

 

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

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

#排序算法#【4】快速排序,布布扣,bubuko.com

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

标签:c   style   class   blog   code   java   

原文地址:http://www.cnblogs.com/fanchangfa/p/3762644.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!