在屈婉玲的《算法设计与分析中》看到快速排序的代码,感觉挺精炼的。特此记录以下。
//交换两个数
void swap(int *a, int *b) {
int tmp=*a;
*a=*b;
*b=tmp;
}
//找出arr[p]应该在的位置
int Partition(int arr[], int p, int r) {
int x=arr[p], j=r+1, i=p; //注意j的初始值为r+1,而i的初始值为p
while(true) {
do {
j--;
}while(arr[j]>x); //while里面的条件非常巧妙,确保至少会在p处停下来,所以没有写j>=p
do {
i++;
}while(i<=r&&arr[i]<=x); //因为担心i越界,所以在这里加了限制条件i<=r
if(i<j) {
swap(&arr[i], &arr[j]);
} else {
return j;
}
}
}
void Quicksort(int arr[], int p, int r) {
if(p<r) {
int q=Partition(arr, p, r);
swap(&arr[p], &arr[q]);
Quicksort(arr, p, q-1);
Quicksort(arr, q+1, r);
}
}
int main() {
int a[10]={10,9,8,7,6,5,4,3,2,1};
Quicksort(a, 0, 9);
for(int *p=a; p<a+10; p++) {
cout << *p << endl;
}
return 0;
}