代码改变世界

《算法导论》第7章 快速排序 (四种变形)

2012-02-24 23:19  htc开发  阅读(249)  评论(0编辑  收藏  举报


这一章的正文及思考题部分讲到了快速排序及其几种变形,包括:Hoare快排,
普通快排,随机快排,三数取中快排。

这些快排的区别主要是划分方法PARTITION算法的不同:如何选取主元,划分出的
两部分范围是什么。根据划分出的范围不同,各变形的QUICKSORT有微小的差别。


1. Hoare快排

Hoare划分是最初的版本,与《算法导论》中的划分版本相比,它选取第一个元素A[p]为主元。
划分后的两部分是:A[p..j]和A[j+1..r],主元可能放入某一个之中。



2. 普通快排

选取最后一个元素A[r]为主元后,j 从头遍历到尾,i 是两范围的分隔。
划分结果为[p, q - 1]和[q + 1, r]。



3. 随机快排

通过头文件stdlib.h中的rand()方法生成[p, r]之间的随机数作为主元。
rand() % n 将生成 [0, n)之间的随机数。
为了重用partition方法,将选定的主元交换到位置 r。



4. 三数取中快排

每次划分前,从当前子数组里随机取出三个数,取这三个数的中间数作为主元的索引。