更新于 

快速排序

题目说明

伪代码(具体实现见模板2)

Quicksort(f, l)

Input: af , af+1 , …, al .

Output: af ,af+1 , …, al 的有序序列

​ If f >= 1 then Return

​ X := af

​ i := f

​ j := l

​ While i < j do

​ Begin

​ While aj >= X do

​ j := j - 1

​ ai <-> aj

​ While ai <= X do

​ i := i + 1

​ ai <-> aj

​ End While

​ Quicksort(f, j - 1)

​ Quicksort(j + 1, l)

​ End If

快排模板1(优美版)

1
2
3
4
5
6
7
8
9
10
11
12
13
void quick_sort(int nums[], int l, int r) {
if (l >= r) return;

// 选取中间值做分隔点
// i 取 l - 1、j 取 r + 1 是因为要做do-while
int i = l - 1, j = r + 1, x = nums[l + r >> 1];
while (i < j) {
do ++i; while (nums[i] < x); // while (nums[++i] < x);
do --j; while (nums[j] > x); // while (nums[--j] > x);
if (i < j) swap(nums[i], nums[j]);
}
quick_sort(nums, l, j), quick_sort(nums, j + 1, r);
}

快排模板2(经典思想)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void quick_sort(vector<int> &nums, int l, int r) {
if (l + 1 >= r) return;

// 选取数组第一个元素做分隔点
int first = l, last = r - 1, key = nums[first]; // 交换步骤1
while (first < last) {
while(first < last && nums[last] >= key)
--last;
nums[first] = nums[last]; // 交换步骤2
while (first < last && nums[first] <= key)
++first;
nums[last] = nums[first]; // 交换步骤3
}
nums[first] = key; // 交换步骤4
quick_sort(nums, l, first);
quick_sort(nums, first + 1, r);
}

例题

AcWing 785 快速排序(模板题)