第七章 快速排序
总结:这章讲了快速排序的算法,分析了算法复杂性,又讲了快速排序的随机版
1. 快速排序
PARTITION(A, p, r)将A[p…r]进行就地重排,返回q,其中A[p…q-1]中的元素都小于A[q],A[q+1,…r]中的元素都大于A[q]。
QUICKSORT(A, p, r)递归排序
分析:最坏情况O(n^2)
最好情况O(nlgn)
平均情况O(n^2)
伪代码
PARTITION (A, p, r)
x <- A[r]
i <- p-1
for j <- p to r-1
do if A[j]<=x
then i <- i+1
exchange A[i] <-> A[j]
exchange A[i+1] <-> A[r]
return i+1
QUICKSORT(A, p, r)
if p < r
then q <- PARTION(A, p, r)
QUICKSORT(A, p, q-1)
QUICKSORT(A, q+1, r)
#include using namespace std; int partition(int a[],int p,int r) //a[p...r] { int i=p-1; int j=p; int temp; int key=a[r]; for(j=p;j=r) return; int q=partition(a,p,r); quickSort(a,p,q-1); quickSort(a,q+1,r); } int main() { int a[10]={2,3,6,1,4,7,0,9,8,5}; quickSort(a,0,9); for(int i=0;i<10;i++) cout << a[i] << endl; }
2. 快速排序的随机版
引入了随机算法,在PARTITION中不用A[r]做主元,而是从子数组A[p…r]中随机选择一个元素作为主元。
分析:最坏情况O(n^2)
最好情况O(nlgn)
平均情况O(n^2)
伪代码
RANDOMIZED-PARTITION(A, p, r)
i <- RANDOM(p, r)
exchange A[i] <-> A[r]
return PARTITION(A, p, r)
#include #include using namespace std; void exchange(int &a, int &b) { int temp=a; a=b; b=temp; } int randomizedPartition(int a[], int p, int r) { int i=p-1; int j=p; srand(time(NULL)); int k=p+rand()%(r-p+1); exchange(a[k],a[r]); for(j=p;j=r) return; int q=randomizedPartition(a,p,r); randomizedQuickSort(a,p,q-1); randomizedQuickSort(a,q+1,r); } int main() { int a[10]={2,3,6,1,4,7,0,9,8,5}; randomizedQuickSort(a,0,9); for(int i=0;i<10;i++) cout << a[i] << endl; }