zoukankan      html  css  js  c++  java
  • 数据结构与算法学习记录:快速排序

    快速排序的基本思想:
    分治法,即,分解,求解,组合 .

    分解:
    在无序区R[low..high]中任选一个记录作为基准(通常选第一个记录,并记为Pivot,其下标为pivotpos),以此为基准划分成两个较小的子区间R[low,pivotpos - 1]和R[pivotpos + 1 , high],并使左边子区间的所有记录均小于等于基准记录,右边子区间的所有记录均大于等于基准记录,基准记录无需参加后续的排序。而划分的关键是要求出基准记录所在的位置pivotpos.

    求解:
    通过递归调用快速排序对左、右子区间R[low..pivotpos-1]和R[pivotpos+1..high]快速排序

    组合:
    当"求解"步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,"组合"步骤无须做什么,可看作是空操作。

    具体过程:
    设序列为R[low,high],从其中选第一个为基准,设为pivot,然后设两个指针i和j,分别指向序列R[low,high]的起始和结束位置上:
          1),将i逐渐增大,直到找到大于pivot的关键字为止;
          2),将j逐渐减少,直到找到小于等于pivot的关键字为止;
          3),如果i<j,即R[i,j]的元素数大于1,则交换R[i]和R[j];
          4),将基准记录pivot放到合适的位置上,即i和j同时指向的位置,则此位置为新的pivotpos。

    备注:
    快速排序是不稳定排序,即相同的关键字排序后,相对位置是不确定的。

    示例代码:
    快速排序代码C#
  • 相关阅读:
    学习PyQt5(二):PyQt5布局管理
    学习PyQt5(一):安装PyQt5以及在PyCharm上配置PyQt5
    Day037--Python--线程的其他方法,GIL, 线程事件,队列,线程池,协程
    Day036--Python--线程
    Day035--Python--管道, Manager, 进程池, 线程切换
    Day034--Python--锁, 信号量, 事件, 队列, 生产者消费者模型, joinableQueue
    Day033--Python--进程
    Day032--Python--操作系统, process进程
    Day30--Python--struct, socketserver
    Day29--Python--缓冲区, 粘包
  • 原文地址:https://www.cnblogs.com/kwklover/p/651128.html
Copyright © 2011-2022 走看看