算法导论 学习笔记 第七章 快速排序

分两部分讲:快速排序和随机化快速排序

其中很多关于分析的部分并不怎么懂,所以先略过...

快速排序

快速排序的核心思想还是分治法。选取一个主元(一般选择第一个,或者是最后一个元素)递归的将整个数组分成两部分。
而这个两部分的左边部分的元素全部小于等于主元,右边的部分大于主元。
快速排序是稳定的排序,并且是原地排序,平均运行时间是nlogn。就像集合了归并排序和插入排序两者的优点

下面以分治法的三步骤来分析快速排序的运行:

divide:这个部分就是递归的将数组分成两部分
conquer:将分成两部分的数组继续递归的解决。
combine:因为快排是原地排序(in place)所以其实没有合并这一说了。

上两个伪代码:

%快速排序的伪代码
QUICKSORT(A,p,r)
1 if p < r
2   then qPARTITION(A,p,r)
3       QUICKSORT(A,p,q-1)
4       QUICKSORT(A,q+1,r)

%这是划分的伪代码
PARTITION(A,p,r)
1 x ← A[r]
2 ip - 1
3 for j ← p to r - 1
4   do if A[j] ≤  x
5       then ii + 1
6           exchange A[i]A[j]
7 exchant A[i+1]A[r]
8 return i + 1

快速排序的性能

快速排序的算法性能分三种情况

最好的情况

最好的情况是每次划分都能将数组分成均匀的两部分。

他的运行时间是 O(nlgn)

平均情况

平均情况的运行时间比较接近最好的情况,运行时间也是 O(nlgn)

最坏的情况

最坏的情况就是每次划分的时候一部分的元素个数是0,一部分的元素个数是n-1

这种情况下运行时间是 O(n2) ,这个结果就跟插入排序一样的了。

随机快速排序

随机快速排序就是每次取得主元不是第一个或者是最后一个元素了。是从数组当中随机抽取一个。这样快速排序的性能就不受数组元素的输入顺序了。

上随即快速排序的伪代码:

%快速排序的伪代码
RANDOMIZED-QUICKSORT(A,p,r)
1 if p < r
2   then qRANDOMIZED-PARTITION(A,p,r)
3       RANDOMIZED-QUICKSORT(A,p,q-1)
4       RANDOMIZED-QUICKSORT(A,q+1,r)

%这是划分的伪代码
RANDOMIZED-PARTITION(A,p,r)
1 iRANDOM(p,r)
2 exchant A[r]A[i]
3 return PARTITION(A,p,r) 

其实我感觉看这本书,有很多真正重要的部分我并没有看懂。以后会将更深入的了解在这里作补充(等我学会了)。

你可能感兴趣的:(Introduction,to,Algorithms)