您的位置:首页 > 其它

《算法导论》第7章 快速排序 个人笔记

2017-05-08 10:29 337 查看

第7章 快速排序

7.1 快速排序

void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}

int partition(int a[], int low, int high)
{
int privotKey = a[low];
while(low < high){
while(low < high  && a[high] >= privotKey) --high;
swap(&a[low], &a[high]);
while(low < high  && a[low] <= privotKey ) ++low;
swap(&a[low], &a[high]);
}
return low;
}

void quickSort(int a[], int low, int high){
if(low < high){
int privotLoc = partition(a, low, high);
quickSort(a, low, privotLoc -1);
quickSort(a, privotLoc + 1, high);
}
}


7.2 快速排序的性能

快速排序的运行时间依赖于划分是否平衡。

最好情况:partition得到的两个子问题的规模都不大于n/2,递归式为

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

根据主定理,上述递归式的解为T(n)=Θ(nlgn)。

7.3 快排的随机版本

int randomized_partition(int a[], int low, int high){
int i = random(low, high);
swap(&a[low], &a[i]);
partition(a, low, high);
}

void randomized_quickSort(int a[], int low, int high){
if(low < high){
int privotLoc = randomized_partition(a, low, high);
randomized_quickSort(a, low, privotLoc -1);
randomized_quickSort(a, privotLoc + 1, high);
}
}


7.4 快排分析

最坏情况:

T(n)=max{0≤q≤n−1}(T(n)+T(n−q−1))+Θ(n)

猜测T(n)≤cn2成立,代入上式,得:

T(n)=max{0≤q≤n−1}(cq2+c(n−q−1)2)+Θ(n)=c∗max{0≤q≤n−1}(q2+(n−q−1)2)+Θ(n)≤c∗(n−1)2/2+Θ(n)≤cn2

期望运行时间:

定义:zi是数组A中地i小的元素,Zij={zi,zi+1,...,zj},Xij=I{zi compare with zj},X=∑n−1i=1∑nj=i+1Xij

E[X]=∑i=1n−1∑j=i+1nE[Xij]=∑i=1n−1∑j=i+1nP(zi compare with zj)

zi与zj会进行比较,当且仅当Zij中将被选为主元的第一个元素是zi或zj。于是有P(zi compare with zj)=2j−i+1,所以有

E[X]=∑i=1n−1∑j=i+1n2j−i+1=∑i=1n−1∑k=1n−i2k+1<∑i=1n−1∑k=1n2k=∑i=1n−1O(lgn)=O(nlgn)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法导论