【排序】快速排序及其非递归实现,归并排序详解

快速排序

  快速排序(Quicksort)是对冒泡排序的一种改进。
  我们知道快速排序用的是分治的基本思想:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归的解决这些子问题,然后将这些子问题的解组合为原问题的解。
  快速排序的基本思想是:

  通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序的基本思想用分治法可描述为:

  • 分解:将一个序列以一个基准值分解为两个部分,一个部分所有值都比基准值小,另一个部分所有值都比基准值大
  • 求解:通过递归调用快速排序单趟排序算法对左右子区间进行单趟排序
  • 组合:当求解步骤中的两个递归调用结束时,其左右两个子区间已有序。

  快速排序的过程如下图:
  这里写图片描述

  • 首先先找到最右边元素key = a[right],将key作为基准值,单趟排序后所有key左边的数全部小于key,右边的数全部大于key。
  • 从begin=left,end=right-1两个方向开始找,begin索引找的是比key大的数字,因为要找到比key大的数字然后与后面比key小的数字交换。
  • 在begin小于end的前提条件下,只要begin找到比key大的数字,end找到比key小的数字,就交换两个值,然后继续寻找。begin++,end–
  • 当begin小于end不成立,即begin==end时,判断a[begin]与key两个值,如果a[begin]>key,那么交换两个值。

    上面判断a[begin]>key的目的是:当一个数组只有两个数字的时候,如果不进行判断,会多一次交换。

      上面的过程有些抽象,现在放上代码:
      


int PartSort(int* a, int left, int right)
{
    int key = a[right];

    int begin = left;
    int end = right-1;

    while (begin < end)
    {
        // 找大
        while (begin < end && a[begin] <= key)
            ++begin;

        // 找小
        while (begin < end && a[end] >= key)
            --end;

        if (begin < end)
            swap(a[begin], a[end]);
    }

    if (a[begin] > a[right])
    {
        swap(a[begin</
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值