#include <cstdio>
#include <iostream>
using namespace std;
// 双游标版本
int* partition(int *l, int *r)
{
int *i = l+1, *j = r-1;
int aim = *l, temp;
while(i<=j) {
while(i<=j && *i<=aim) i++;
while(i<=j && *j>aim) j--;
if(i<=j) {
temp = *i;
*i = *j;
*j = temp;
i++;
j--;
}
}
temp = *l;
*l = *j;
*j = temp;
}
// 单游标版本 1
// 维护这样一个区间 [ <=aim | >aim | unknown], k指向第一个>aim的位置
int* partition2(int *l, int *r)
{
int *k = l+1;
int aim = *l, temp;
for(int *p=l+1; p < r; p++) {
if(*p <= aim) {
temp = *p;
*p = *k;
*k = temp;
k++;
}
}
temp = *(k-1);
*(k-1) = *l;
*l = temp;
// for(int *p=l; p < r; p++) {
// printf("%d ", *p);
// }
// printf("\n");
return k-1;
}
// 单游标版本 2
// 维护这样一个区间 [ <=aim | >aim | unknown], k指向最后一个<=aim的位置
int* partition3(int *l, int *r)
{
int *k = l;
int aim = *l, temp;
for(int *p=l+1; p < r; p++) {
if(*p <= aim) {
temp = *p;
*p = *(k+1);
*(k+1) = temp;
k++;
}
}
temp = *k;
*k = *l;
*l = temp;
// for(int *p=l; p<r; p++) {
// printf("%d ", *p);
// }
// printf("\n");
return k;
}
void quick_sort(int *l, int *r)
{
if(r-l<2) return; // 只有当序列长度>=2时,才需要排序
// int *mid = partition(l, r);
int *mid = partition3(l, r);
quick_sort(l, mid);
quick_sort(mid+1, r);
}
int main ()
{
int a[] = {6,2,1,8,7,5,3,4};
// int a[] = {2,4,3,1};
int n = sizeof(a) / sizeof(int);
quick_sort(a, a+n);
for(int i=0; i<n; i++) printf("%d ", a[i]);
return 0;
}