基本算法流程
1. 将最左边的数选择为基数,并分别将最左边和最右边赋值给左右指针(l, r)
2. 移动右指针,遇到小于基准值的值,将值放入l的位置,l++
3. 移动左指针,遇到大于基准值的值,将值放入r的位置,r–
4. 直到左右指针相遇,将基准值放入l的位置
代码实现
可以作为模板保存,也要注意快排中都不要加等于号,都是 < 或者 >
void quick_sort(int *num, int left, int right) {
if (left > right) { // 相等的时候,可以再只想一次也可以直接返回
return ;
}
int l = left;
int r = right;
int pivot = num[l]; // 选择基准值
while (l < r) {
while (l < r && num[r] > pivot) { // num[y] > z, 不要写成大于等于。如果是一组全相等的数字,加了等于号,相当于每次patition为1 和 n - 1, 效率低,不加等于号效率更稳定
r--;
}
if (l < r) {
num[l++] = num[r]; // 位置r变为待赋值的位置
}
while (l < r && num[l] < pivot) {
l++;
}
if (l < r) {
num[r--] = num[l]; // 位置l变为待赋值的位置
}
}
num[l] = pivot; // 此时 l == r,为num[l] 或者 num[r]赋值均可
quick_sort(num, left, l - 1);
quick_sort(num, l + 1, right);
return;
}