蓝桥杯 快速排序
蓝桥杯 快速排序
【题目描述 - Problem Description】
排序在各种场合经常被用到。 快速排序是十分常用的高效率的算法。
其思想是:先选一个“标尺”, 用它把整个队列过一遍筛子, 以保证:其左边的元素都不大于它,其右边的元素都不小于它。
这样,排序问题就被分割为两个子区间。 再分别对子区间排序就可以了。
下面的代码是一种实现,请分析并填写划线部分缺少的代码。
1 #include <stdio.h> 2 3 void swap(int a[], int i, int j) 4 { 5 int t = a[i]; 6 a[i] = a[j]; 7 a[j] = t; 8 } 9 10 int partition(int a[], int p, int r) 11 { 12 int i = p; 13 int j = r + 1; 14 int x = a[p]; 15 while(1){ 16 while(i<r && a[++i]<x); 17 while(a[--j]>x); 18 if(i>=j) break; 19 swap(a,i,j); 20 } 21 _______________;//填空位置 22 return j; 23 } 24 25 void quicksort(int a[], int p, int r) 26 { 27 if(p<r){ 28 int q = partition(a,p,r); 29 quicksort(a,p,q-1); 30 quicksort(a,q+1,r); 31 } 32 } 33 34 int main() 35 { 36 int i; 37 int a[] = {5,13,6,24,2,8,19,27,6,12,1,17}; 38 int N = 12; 39 40 quicksort(a, 0, N-1); 41 42 for(i=0; i<N; i++) printf("%d ", a[i]); 43 printf("\n"); 44 45 return 0; 46 }
【题解】
快排的思想就是区间整理,实现策略大同小异……
在partition没有使用赋值实现交换,那么填空部分则不会是直接赋值。
在看循环中的下标,跳过首发元素,那么需要补充的代码就是将x归位。(可以通过只是递归从输出看出)
观察循环结束后的区间状态:x[<=x,j下标落脚][i下标落脚,>=x]
所以直接交换初始x的位置p,和符合条件的下标j
【最终结果】
swap(a, p, j)