[数据结构]快速排序的子问题, 如何找出一个某个值在一个序列中的位置?
我们都知道快速排序, 伪代码大致是这样子的:
int partition(Array &A, int low, int high) {
?
}
void quickSort(Array &A, int low, int high){
int pos = partition(A, low, high);
quickSort(A, low, pos-1);
quickSort(A, post+1, high);
}
我们可以看到, 快速排序是采用了递归, 主程序结构简单, 那么关键的partition(中文意思"划分")这个函数怎么写呢?
我们参考很多标准的程序代码, 比如这段经典的 partition函数
int partition(Array &A, int low, int high){
int tmp = A[low];
while ( low < high ){
while ( A[high] >= tmp && low < high ) high--;
A[low] = A[high];
while ( A[low] <= tmp && low < high) low++;
A[high] = A[low];
}
A[low] = tmp;
return low;
}
这段经典的代码, 我想问一下: 如果是你自己写, 能顺利的写下来吗?
即: 如何定位一个元素在数列中的位置, 并且把比它小的丢到前面去, 把比它大的放到后面去?
这段程序有非常多种实现方法? 但是可以发现, 上面这段代码是非常简洁的, 很难写出比这段代码更加优雅的定位和移位代码了.
你有没有想过自己动手写? 或者能把这段代码默写下来呢?
我提供一串序列, 大家可以自行推论, 排序过程, 并且用自己觉得优美的代码写下来.
序列是 4, 1, 2, 3, 5, 3.5, 6, 7.
如何定位4的位置?
请自己尝试默写, 或者按照自己的思路把快速排序的核心代码, 如何快速定位一个元素的位置并且保证 这个位置之前的数小而这个位置之后的数大呢?
我有一个觉得非常难的问题, 难倒了我自己, 放在这里请大家自行回答:
1. 为什么上面那段代码, 要先从最右边开始检查, 即是这一句: while ( A[high] >= tmp && low < high ) high--;
而不是:
while ( A[low] <= tmp && low < high ) low++; 呢? 请大家思考.