I
587I
/2
8>7H;D#8#33若 DE8F足够小则直接对 DE8F进行插入排序
07/2
588##DI33将 DE8F分解为 DE8F和 DE6F两部分
J1H;8##DI33递归排序 DE8F
J1H;6##DI33递归排序 DE6F
I
I
对线性表 DEF进行排序,只要调用 J1H;##D就可以了。算法首先判断 DE8F是否足够小,若足够小则
直接对 DE8F进行排序,; 可以是任何一种简单的排序法,一般用插入排序。这是因为,对于较小的表,快速排序中划
分和递归的开销使得该算法的效率还不如其它的直接排序法好。至于规模多小才算足够小,并没有一定的标准,因为这跟
生成的代码和执行代码的计算机有关,可以采取试验的方法确定这个规模阈值。经验表明,在大多数计算机上,取这个阈
值为 较好,也就是说,当 8 即 DE8F的规模不大于 时,直接采用插入排序法对 DE8F进行排序参见
Sorting and Searching Algorithms: A Cookbook。当然,比较方便的方法是取该阈值为 ,当待排序的表只有一个
元素时,根本不用排序其实还剩两个元素时就已经在 函数中排好序了,只要把第 行的 语句该为 8
C07。这就是通常教科书上看到的快速排序的形式。
注意:算法 J1H; 中变量 的值一定不能等于 ,否则该过程会无限递归下去,永远不能结束。因此下文中在
8
函数 里加了限制条件,避免 情况的出现。
算法 J1H; 中调用了一个函数 8,该函数主要实现以下两个功能:
在 DE8F中选择一个支点元素 8I
对 DE8F中的元素进行整理,使得 DE8F分为两部分 DE8F和 DE6F,并且 DE8F中的每一个元素的值不
大于 8,DE6F中的每一个元素的值不小于 8,但是 DE8F和 DE6F中的元素并不要求排好序。
快速排序法改进性能的关键就在于上述的第二个功能,因为该功能并不要求 DE8F和 DE6F中的元素排好序。
函数 8 可以实现如下。以下的实现方法是原地置换的,当然也有不是原地置换的方法,实现起来较为简单,
这里就不介绍了。
188#587ID5D7587I
85+04)&8I
#L587I
/2
85;01H8##DI33在 DE8F中选择一个支点元素 8
58I
L56I
90
/2
%8L5L0DELF8I33移动左指针,注意这里不能用 90 循环
(8560DEFG8I33移动右指针,注意这里不能用 90 循环