快速排序可以看成对冒泡排序的一种改进。基本思想是:通过一趟排序将待排序列分为两部分,其中一部分的值均比另一部分的值要小,然后分别对这两部分继续进行排序。
算法过程举例说明如下,假设输入为:
8 | 1 | 4 | 9 | 6 | 3 | 5 | 2 | 7 | 0 |
(1) 用三数中值分割法取一个pivot。从头、中间、尾取3个数分别为8, 6, 0, 中值为6,即选6为pivot。
(2) 将序列分割为{小于6的数}, 6, {大于6的数}三部分
将pivot与最后的元素交换使得枢纽元离开要分割的数据段。
8 | 1 | 4 | 9 | 0 | 3 | 5 | 2 | 7 | 6 |
i | j | pivot |
向右移动i直到指向的值大于pivot,向左移动j直到指向的值小于pivot。如果i在j的左边,则将这两个元素互换。
2 | 1 | 4 | 9 | 0 | 3 | 5 | 8 | 7 | 6 |
i | j | pivot |
最后,将pivot与i所指的元素交换。
(3) 分别对{小于pivot部分}和{大于pivot部分}进行第(2)步的分割。
这个明显是递归了,递归要注意终止条件。
如果移动i, j的过程中遇到了等于pivot的值怎么办?最好的选择是让i和j停止移动,否则运行时间将可能达到O(N^2)。