voidquick_sort( int q[] , int l , int r ) { if (l >= r) //排序完成,退出函数 return; int x = (q[l]+q[r]) /2; //设置基准点 int i = l -1 ; int j = r + 1 ; while( i < j ) //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); }
intmain() { 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]); return0; }
引申:快速选择算法
给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。
intquick_sort( int l, int r, int k )//直接返回第k个数值 { if (l == r) return q[l]; //相当于只有一个数字了,直接返回就可以了
int x = (q[l] + q[r]) / 2, i = l - 1, j = 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]); } int sl = j- l +1; //计算 左边的数字数目, 与k比较 if( sl >= k) returnquick_sort( l, j, k ); //数目 大于 等于 k , 只需要对左边进行递归就可以了 returnquick_sort( j + 1, r , k-sl); //小于 k , 则对右边进行递归 }
intmain() { scanf("%d%d", &n, &k); for (int i = 0; i < n; i++) scanf("%d", &q[i]); printf("%d", quick_sort( 0, n - 1,k)); return0; }