#include <iostream>
using namespace std;
const int N =100010;
int n;
int q[N];
void kp(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1;
int j = r + 1;
int 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]);
}
kp(q, l, j); //此处不可换成kp( q , l , i );
kp(q, j+1, r); kp( q , i,r);
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &q[i]);
}
kp(q, 0, n - 1);
for (int i = 0; i < n; i++)
{
printf("%d ", q[i]);
}
return 0;
}
基本思路:先找一个数组中的值x(最好找中间,不然会有边界问题),然后利用双指针不断向中间靠拢,左指针如遇到大于x的值则停下,右指针若遇到小于x的值则停下,然后交换两数,重复该操作直到两指针相遇,最后递归,不断缩小范围,最后输出。