1、算法的原理
举个栗子:
选择分界线为第一个数 (x=3)
任务:(i)指针(红,左)找到大于等于(3)停止,(j)指针(绿,右)找到小于等于(3)的停止。
(1)左指针(i)指向第1个数(3),右指针(j)指向最后一个数(5)。(Start!)
(2)左指针(i)指向的是数字(3),这是大于等于(3)的(现在是等于),它停止下来。
(3)右指针(j)指向的是数字(5),它是大于(3)的,继续向前,找到倒数第二个数(3),这个是小于等于(3)的(现在是等于),停下来。
(4)然后两个位置的数字进行交换,本例中是两个3,交换不交换是一样的。
(5)两个指针分别向中间移动一位,(i++,j--)。
(6)现在红色指针(i)指向的(1)是小于(3)的,所以继续向后移动。
(7)再看(2),因为(2)也是满足小于3的,所以指针(i)继续向前移动。发现现在是(3),(3)是大于等于3的,(i)停下来。
(8)再看(j),(j)现在指的是(2),(2)是小于等于3的,(j)指针停下来。
(9)至此,(i,j)两个指针不是相遇,而是已经穿过!!注意,是穿过!这时需要结束本次运算了,不能再交换这两个数,结果就是(j)左边的比(3)小,(j+1)及以上比(3)大。
C++ 代码
#include<iostream>
using namespace std;
const int N = 100010;
int q[N];
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);
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &q[i]);
quick_sort(q, 0, n - 1);
for (int i = 0; i < n; i++) printf("%d ", q[i]);
return 0;
}
还有从大到小排序的模板(仅仅改两个地方的判断符号)
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);
}