快速排序法

Posted 谢维开

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序法相关的知识,希望对你有一定的参考价值。

这个排序方法的时间复杂度为O(nlogn),最坏时间复杂度为O(n^2),所以说是属于所有排序方法中比较高效率的一种了。

 

这种排序方法的基本思想是:

先找到一个区间中的一个基准点,然后找到这个区间右边所有小于这个基准点的元素都放到基准点左边,还有这个区间左边所有左边大于这个基准点的元素都放到基准点右边。用递归思想,将区间化小,一直小到只有一个元素即排序完成。

百度百科这么说的:快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

该思想的实现代码写出来可能不一样,但是思想大概就是这个思想。

下面是我搜集到的一个人写的快速排序的代码:

复制代码
 1 void partition(int a[], int start,int end)
 2 {
 3     if(start>=end)
 4         return;
 5     
 6     int low = start;
 7     int heigh = end;
 8     int index = a[low];                      // 基准点选在区间开头的元素
 9     
10     while(low<heigh)
11     {
12         while(a[heigh]>index&&low<heigh)     // 从区间右侧开始,找到比基准点index小的元素就放到区间左边
13         {
14             heigh--;
15         }
16         if(low<heigh)
17         {
18             a[low++] = a[heigh];
19         }
20         while(a[low]<index&&low<heigh)       // 从区间左边开始,找到比基准点index大的元素就放到区间右边
21         {
22             low++;
23         }
24         if(low<heigh)
25         {
26             a[heigh--] = a[low];
27         }
28     }
29     
30     a[low] = index;                        // 把基准点放到区间中间
31     partition(a,start,low-1);              // 把基准点左侧的区间进行整理----递归
32     partition(a,low+1,end);                // 把基准点右侧的区间进行整理----递归
33 }
复制代码

下面是调用示例

    int a[] = {1,3,5,4,3,0,8,6};    
    partition(a,0,7);

运行结果

参考文章:

  1. http://www.cnblogs.com/surgewong/p/3381438.html
  2. http://baike.baidu.com/link?url=GDBGdDYxqZmDS.....
  3. http://www.cnblogs.com/luchen927/archive/2012/02/29/2368070.html

以上是关于快速排序法的主要内容,如果未能解决你的问题,请参考以下文章

重温基础算法内部排序之快速排序法

找到多个名为 [spring_web] 的片段。这对于相对排序是不合法的

基础排序算法总结(代码+图片分析)

排序02-直接插入排序法

php 四种基础算法 ---- 快速排序法

快速排序/快速选择算法