快排
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j)
{
do i ++ ; while (q[i] < x);
do j -- ; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
- 为什么
l>=r
时结束- 当
l=r
时,说明当前子数组只有一个元素,已经是排好序的 - 当
l>r
时,说明当前子数组为空,不需要排序
- 当
为什么初始化
int i = l - 1, j = r + 1
因为在进入主循环前,i
和j
会先被更新(通过do i++
和do j--
),l-1
和r+1
是为了预先补回来这个1- 为什么
i>=j
时结束
因为此时所有元素都已经被正确划分:- 索引
j
及其左侧的所有元素都≤轴心值 - 索引
j
右侧的所有元素都≥轴心值
- 索引
为什么递归参数是
j
,j+1
而不是i
可以用i
来划分,这里是我记错了,应该是 “不能改用quick_sort(q, l, j-1), quick_sort(q, j, r)
作为划分”,至于为什么,可以自己模拟一下3 1 4 2 5
的第一趟排序过程。注意区分
i
,j
和l
,r
do...while
的语法——1️⃣不能加{ } 2️⃣while后面要有;
1 2
do i++; while(q[i]<x); //correct do {j--}; while(q[j]>x)//error
This post is licensed under CC BY 4.0 by the author.