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


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

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

  • 相关阅读:
    第一章 管理程序流(In .net4.5) 之 实现多线程和异步处理
    第十三章 接口
    第十二章 泛型
    第十一章 事件
    SqlServer杀死所有正在使用中的进程
    SqlServer数据库一直显示“正在还原”问题
    大叔学Spring Boot笔记(二)基本概念
    大叔学Spring Boot笔记(一)初识Sprint Boot
    SqlServer中的对象类型代码
    SqlServer将Json串转成表结果
  • 原文地址:https://www.cnblogs.com/notfresh/p/quickSortPartition.html
Copyright © 2020-2023  润新知