2.6 快速排序(quick sort)
2.6.1 算法思路
整体思路: 随机选一个数,把比它大的数放在它的右边,小的放在左边,那个数所在的位置,就会是它最终排序所在的位置。然后继续排左右两边的数,按这种思路往下递归。
细节步骤: 随机选择的那个数,我们称之为“基准数”。
- ① 设置基准数。随机选择一个数为基准数,把基准数和首元素交换位置
- ② 移动指针。设置左指针和右指针,左指针从左往右移动,一旦找到比基准数大的元素就停下来,然后左指针从右往左移动,一旦找到比基准数小的元素就停下来,然后把它俩互换位置,同理,左右指针继续向中间移动,直到两个指针重合或者错位
- ③ 插入基准数。基准数如果比右指针的元素小,就把基准数和右指针的左边一个元素互换位置,如果基准数比右指针的元素大,就把基准数和尾指针元素互换。
- ④ 递归。基准数的左右两部分继续进行排序。
请问,步骤④中:
- 当基准数比右指针的元素小,为什么不可以是把基准数和左指针交换?
- 基准数如果比右指针元素大,为什么是把基准数和尾指针元素互换?
- 基准数如果比右指针元素大,是否可以把基准数和右指针右边的一个数交换?
回答:
- 1.因为左右指针可能位置重合。
- 2.(看代码)但凡右指针有移动过,则右指针所指元素必然大于等于基准元素,如果右指针元素小于基准元素,则说明右指针必然没有移动过,此时右指针跟尾指针重合。如果右指针元素等于基准元素,意味着右指针及其右侧的元素(如果存在的话)都必然等于基准元素,所以直接把基准元素跟尾指针元素互换,没有问题。
- 3.不可以,若右指针是尾指针,其右侧将发生越界。
2.6.2 代码实现
// 快速排序
public static int[] quickSort(int[] originalData) {
int [] sortedData=originalData.clone();
QSRecursion(sortedData