目录
详解快速排序
快速排序是一种非常高效的算法,从其名字可以看出这种排序算法最大的特点是快。当表现良好时,快速排序的速度比其他主要对手(如归并排序)快 2 ~ 3 倍。
快速排序的基本思想是分治法,排序过程如下所示:在输入数组中随机选取一个元素作为中间值(pivot),然后对数组进行分区(partition),使所有比中间值小的数据移到数组的左边,所有比中间值大的数据移到数组的右边。接下来对中间值左右两侧的子数组用相同的步骤顺序,直到子数组中只有一个数字为止。
理解快速排序的关键在于理解它的分区的过程。下面以数组 [4, 1, 5, 3, 6, 2, 7, 8] 为例分析分区的过程。假设数字 3 被随机选中为中间值,该数字被交换到数组的尾部。接下来初始化两个指针,指针 P1 初始化至下标为 -1 的位置,指针 P2 初始化至下标为 0 的位置,如下图 (a) 所示。始终将指针 P1 指向已经发现的最后一个小于 3 的数字。此时尚未发现任何一个小于 3 的数字,因此将指针 P1 指向一个无效的位置。将指针 P2 从下标为 0 的位置开始向右扫描数组中的每个数字。当指针 P2 指向第 1 个小于 3 的数字 1 时,指针 P1 向右移动一格,然后交换两个指针指向的数字,此时数组(即两个指针)的状态如下图 (b) 所示。继续向右移动指针 P2 直到遇到下一个小于 3 的数字 2,指针 P