快速排序

Posted taoxiang

tags:

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

 

  最坏时间复杂度O(n2),最好和平均是O(n*log2n)

  伪代码:

 1 QuickSort(A,low,high)
 2     if(low<high)
 3         index = Partition(A,low,high)
 4         QuickSort(A,low,index-1)
 5         QuickSort(A,index+1,high)
 6 
 7 Partition(A,low,high)
 8     x = A[high]
 9     i = low-1
10     for j=low to high-1
11         if (A[j]<=x)
12             i++
13             if(i!=j) swap(A,i,j)
14     swap(A,i+1,high)
15     return i+1

 

  如果要改变选取枢纽值,比如随机选取而不是选最后一个数,则现将枢纽值和最后一个值交换,然后开始partition(即在行8前面先交换)

 

  最坏情况:选取的值是最小或最大值

    partition的时间与当前partition元素个数有关系

    T(n)=T(n-1)+0+O(n)=T(n-1)+O(n)

    T(n-1) = T(n-2) + O(n-1)

    ....

    

    所以T(n)=O(n)+O(n-1)+...+O(1)=O(n2)

 

  最好情况:选取的值刚好是最中间的值

    T(n)=2T(n/2) + n

    T(n/2)=2T(n/4) + n/2

    .... 

    

    上面共log2n项,所以

      T(n)=2(2T(n/4)+n/2)+n = 4T(n/4)+2n

          =4(2T(T/8)+n/4)+2n = 8T(n/8)+3n

            =....=2T(n/2x) +xn     当x为log2n

         =nT(1)+nlog2n

    所以最好情况复杂度为O(n*log2n)

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

算法排序之堆排序

前端开发工具vscode如何快速生成代码片段

前端开发工具vscode如何快速生成代码片段

如何使用sublime代码片段快速输入PHP头部版本声明

代码片段如何使用CSS来快速定义多彩光标

vs2003:快速片段工具