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

第七章 快速排序

 

总结:这章讲了快速排序的算法,分析了算法复杂性,又讲了快速排序的随机版

 

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; }

你可能感兴趣的:(算法学习)