[数据结构]快速排序的子问题, 如何找出一个某个值在一个序列中的位置?

我们都知道快速排序, 伪代码大致是这样子的:

 

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++;  呢? 请大家思考.

 

posted @ 2019-03-18 23:00  notfresh  阅读(576)  评论(0编辑  收藏  举报