快速排序(单边调换)

来源:互联网 发布:东方网络什么时候复牌 编辑:程序博客网 时间:2024/04/30 09:16
#include <stdio.h>#define MAXLEN100int 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