美文网首页@IT·互联网程序员
3.一步一步分解快排

3.一步一步分解快排

作者: KaelQ | 来源:发表于2016-08-06 17:23 被阅读325次

1.原理

Quick Sort 属于交换排序,是对冒泡算法进行的改造。

基本原理:分治法和填坑法

  • 分治法:
    1. 首先将问题转化为子问题,取数组的第一个元素key,然后将数组里的所有元素小于key的放在左边,大于key的放在右边。
    • 此时再次重复这个过程,去小于key的元素,取第一个元素key2,然后将数组的所有元素小于key2的放在左边,大于key2的放在右边。
    • 再次重复.......直到全部排序好。
  • 填坑法
    1. 用于数组排序,取第一个元素key,然后将a[0]空出来,然后i=0,j=n。
    2. 设置大循环,保证i<j。
    3. 设置子循环,从后往前找,如果大于key就执行j--。
    4. 设置判定语句,如果小于key,将a[j]的值填入a[i]。
    5. 设置子循环,从前往后找,如果小于key就执行j++。
    6. 设置判定语句,如果大于key,就将a[i]的值填入a[j]。
    7. 大循环结束,将key值填入a[i]。
  • 填坑法第一步,设值,key,i,j



  • 从后往前第一次小循环



  • 从前往后第一次小循环



  • 从后往前第二次小循环



  • 结束大循环,将key值填入a[i]。


2.java写法

  • 分为两部分:分治递归quicksort和partition方法。
    实现填坑法partition():
private static int partition(int a[], int i, int j) {
        int key = a[i];//key值
        while (i < j) {
            while (i < j && a[j] > key)// 从右向左小循环
                j--;
            if (a[j] <= key)//判定填充
                a[i] = a[j];
            while (i < j && a[i] < key)// 从左向右小循环
                i++;
            if (a[i] >= key)//判定填充
                a[j] = a[i];
        }
        a[i] = key;// 把轴元素放在轴所在地位置
        return i;// 返回轴所在的位置
    }

实现递归的quicksort():

private void quickSort(int data[], int low, int high) {// 递归
        int q;
        if (low < high) {
            q = partition(data, low, high);
            quickSort(data, q + 1, high);//对q左边进行分类
            quickSort(data, low, q - 1);//对q右边进行分类
        }
    }

3.时间复杂度

  • 对于划分成子问题求解的问题,公式为:
    T(n) = a*T(n/b)+f(n)

  • 最好的情况,每次划分都是按照折半划分,快排的a=b=2,f(n)为partition()的规模。公式为:
    T(n) = 2*T(n/2)+f(n)
    例如 3,2,4。
    复杂度为T(n) = O(nlogn)

  • 最坏的情况,每次划分都是:
    T(n) = T(n-1)+T(1)+f(n)
    例如 2,3,4。
    复杂度为T(n) = O(n^2)

相关文章

  • 3.一步一步分解快排

    1.原理 Quick Sort 属于交换排序,是对冒泡算法进行的改造。 基本原理:分治法和填坑法 分治法:首先将问...

  • JS实现快速排序

    看了一篇通俗易懂的快排文章 快排,下面一步一步 实现整个过程。 快排的基本思想 上面链接的文章对快排的思路提出了一...

  • 几种自学的方法(笔记)

    一、分解步骤 无论学习什么,我们都要需要把它具体化,并分解成一步一步的可操作的步骤。下面给大家介绍一下横向分解和纵...

  • 分解目标,一步一步去做。

    不知道大家有没有这样的感觉,不论做什么事情的话都需要分步去做,不能一口就想吃一个胖子。 昨天看到外面的超市在清理货...

  • 个人管理要点

    个人管理要点 1.做出全年计划,分解为目标和项目 2.将项目分解为下一步行动和待办任务 3.做好每日计划,按计划实...

  • 每一步

    一步深,一步浅, 一步快,一步慢, 一步又一步。 一步左,一步右, 一步前,一步后, 一步又一步。 步步经心, 步...

  • 超效率手册:99个史上更全面的时间管理技巧 个人读书笔记

    一、克服拖延症 3.分解任务。不明确的大任务是滋生拖延症的温床。你需要知道下一步做什么,将大的任务分解成易于行动的...

  • 图解快排

    开始 下面简单演示下如何用快排来实现下面数组从小到大排序 首先什么都别想,跟着我一步一步的实现它 建立模型 将这些...

  • 2019-06-16

    任务分解,就是把公司要求的目标,变成员工可执行的任务。定好目标,一步一步去完成

  • 快速排序

    快排属于交换排序,是起泡(冒泡Bubble)排序的进一步优化http://codevs.cn/problem/10...

网友评论

    本文标题:3.一步一步分解快排

    本文链接:https://www.haomeiwen.com/subject/wcihsttx.html