问题描述:快排在有序或顺序情况下,趟数最多,是n-1次,
但是如果要求最好情况下的最少次数呢?
问题分析:先给出递推式子
规定待排序序列中元素数量 n ≤ 1 时,不需要排序
则 k(1)=0 k(2)=1 趟
结论:
那么 k(3)= k(1) + k(1) +1 = 1 趟
k(4) = k(1)+k(2)+1 = 2 趟
k(5) = k(1) + k(3) +1 = 2 趟 而不是 k(5) = k(2) + k(2) +1 =3 趟
k(6)= k(2)+k(3)+1= 3趟
王海艳书中的伪代码
以序列第一个元素作为基准,令剩余序列的第一个元素是i ,最后一个元素的下一个是 j。
while (i <= j )时{
i指针 不断地向右移动,直到遇到一个比 基准 大的元素,然后停在此处。
j指针 不断的向左移动,直到遇到一个比 基准 小的元素,然后停在此处。
}
把 基准 元素 和 j 指向的元素 交换位置
- k(3) = 1 趟的验证 :
初始序列 : 5 3 4
初始位置 | i | j | |||
序列 | 5 | 3 | 4 | ||
第一堂结果 | 3 | 4 | 5 |
第一趟过程:
j 向左移动停在4,i向右移动停在4,然后,基准元素 5 和 j 指向的 4 交换位置。
- k(5)= 2趟的验证
初始序列 : 3 2 5 4 6
初始位置 | i | j | ||||
序列 | 3 | 2 | 5 | 4 | 6 | |
第一趟结果 | 2 | 3 | 5 | 4 | 6 | |
第二趟结果 | 2 | 3 | 4 | 5 | 6 |
第一趟过程:i指针向右移动指向5,j向左移动指向2,此时 j < i,退出循环,然后 基准 (3) 与 j 指向的元素(2)交换 ,结果:2 3 5 4 6
第二趟过程: 3 已经是最终位置,其左边的子序列只有一个元素 2 ,不需要排序,而右边的子序列{ 5 4 6 }开始递归的进行快速排序,过程参照k(3) ,
最终 排序结果是 2 3 4 5 6