zoukankan      html  css  js  c++  java
  • [数据结构]快速排序的子问题, 如何找出一个某个值在一个序列中的位置?

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

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

  • 相关阅读:
    线性滤波器(linear filter)与非线性滤波器(non-linear filter)
    线性滤波器(linear filter)与非线性滤波器(non-linear filter)
    80后开网店卖故事:1500多位为感觉而埋单
    [置顶] think in java interview-高级开发人员面试宝典(一)
    Android ToggleButton Example--开关按钮
    UVA 10012 How Big Is It?(暴力枚举)
    Windows远程连接的实现
    系统集成项目管理之项目采购管理
    UVA 165 Stamps (DFS深搜回溯)
    EF操作增删改查
  • 原文地址:https://www.cnblogs.com/notfresh/p/quickSortPartition.html
Copyright © 2011-2022 走看看