#include <stdio.h>
#define MAXLEN 100
int a[MAXLEN];
void swap(int a[] , int i , int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
int split(int a[] , int left , int right) {//分离,将子序列按照左小右大的规则分离,中间为枢轴元素
int piv , k;//pivot(枢轴)的下标,k为偏移计数量
int one = a[left];//将子序列的首元素设为枢轴元素
for ( piv = left , k = left + 1 ; k <= right ; k++ )
if ( a[k] < one ) {//如果比枢轴小就和k同步增加,否则就将枢轴卡在大于等于枢轴的元素之前
piv++;
if ( k > piv )//如果k超前于枢轴(意味着k前面有元素把枢轴卡住了,所以要和枢轴元素交换一下
swap(a , piv , k);
}
swap(a , left , piv);
return piv;
}
void qsort(int a[] , int left , int right) {
if ( left < right ) {
int piv = split(a , left , right);
qsort(a , left , piv - 1);//由于出现了下标的减法,为了避免1符号整型的0减1后变成大值,因此次算法不用size_t,下标一律用int表示
qsort(a , piv + 1 , right);
}
}
int main() {
int len;
scanf("%d" , &len);
int i;
for ( i = 0 ; i < len ; i++ )
scanf("%d" , a + i);
qsort(a , 0 , len - 1);
for ( i = 0 ; i < len ; i++ )
printf("%d " , a[i]);
putchar('\n');
return 0;
}
测试数据(两组,执行两次):
5 input
5 4 3 2 1
1 2 3 4 5 output
7 input
3 45 12 34 5 44 8
3 6 8 12 34 44 45 output