《C语言程序设计-第2版》的解读
注意理解“空位”,这里的空位在物理内存上并未空,是我们为了分析问题假设的。因为这样思考的话,我们能很放心大胆地将high指向的错排数据给low指向的“空位”。容易发现,low和high至少有一个指向空位,其中low位置最初指向的是index元素,那么它最初指向的也是个“空位”。
空位不断改变。最后low = high的空位就是给index的!
代码实现解析
问:能否将if(low >= high) break;修改为low == high?
可以,在low/high指标向大/向小行走的过程中,不会出现low>high的情形.
问:能否将if(s >= e) return;修改为s == e?
不能!因为传进来的s和e,可能s == e或s == e+1的情况,分别说明上一次划分后,index左边只有一个元素,或者index左边没有元素。这两种情况都不需要对index"左边"的元素再进行下一次的局部排序。
#include<iostream>
using namespace std;
void printa(int *a){//测试工具
for(int i = 0;i < 10;i++){
printf("%d ",a[i]);
}
printf("\ntest over\n\n");
}
int split(int *a,int s,int e){
int low = s,high = e;
int t = a[s];
while(1){
while(low < high && a[high] >= t)
high--;
if(low >= high)
break;
a[low++] = a[high];
while(low < high &&a[low] <= t)
low++;
if(low >= high)
break;
a[high--] = a[low];
}
a[low] = t;
return low;
} //low和high肯定有一个指向“空”
void quicksort(int *a,int s,int e){
int middle;
if(s >= e) return;
middle = split (a,s,e);
quicksort(a,s,middle-1);
quicksort(a,middle+1,e);
}
int main(){
int a[10] = {27,-1,3,10,23,452,32,4,77,101};
quicksort(a,0,9);
for(int i = 0;i < 10;i++){
printf("%d ",a[i]);
}
}