1 算法描述

快速排序的思想是先选取一个锚节点,将数组中的全部节点与锚节点比较,小于锚节点的值在左侧,大于锚节点的值在右侧,直至将数组分为3部分:

  • 左部分:小于锚节点的数组
  • 中间:锚节点
  • 右部分:大于锚节点的数组;

最后在左部分数组和右部分数组分别迭代,直至结束,此时得到升序数组。

2 算法模版

快速排序的模板分为两部分:

  • 1 实现分区逻辑
  • 2 控制分区的次数

实现分区逻辑:使用快慢指针将数组分为3个区段,小于 – 慢指针 – 大于 – 快指针 – 未知 – 锚节点。慢指针标记一个大于锚点的值,快指针用于查找小于锚点的值,交换用于逻辑处理。

  • 1 使用最右边的值作为锚节点
  • 2 初始化快慢指针为0
  • 3 如果快指针节点的值小于锚节点,则快指针节点的值与慢指针节点的值交换,同时快慢指针的索引都+1
  • 4 如果快指针的值大于等于锚节点,则快指针节点的索引+1,慢指针不变
  • 5 通过while循环后,最后交换快慢指针的值,此时快指针指向的是锚节点。
int partition(vector &array, int left, int right) {
	int pivot = array[right];
	int slow = left, fast = left;
	while (fast < right) {
		if (array[fast] < pivot) {
			swap(array[slow], array[fast]);
			slow++;
		}
		fast++;
	}
	swap(array[slow], array[right]);
	return slow;
}

控制分区的次数:此处可以参考二叉树的前序遍历,实际上分区控制和二叉树遍历是一致的。

  • 1 处理分区逻辑
  • 2 处理左分区逻辑
  • 3 处理右分区逻辑
void quickSort(vector &array, int left, int right) {
	if (left >= right)
		return;
	int middle = partition(array, left, right);
	quickSort(array, left, middle - 1);
	quickSort(array, middle + 1, right);
}