• 什么是漂亮排序算法:一顿操作很装逼,一看性能二点七


    在《算法导论》第二版第 7 章(快速排序)的思考题(第 95 页)中提及到一种 低效的递归排序算法:Stooge 排序, Howard、Fine 等教授将这个算法称为 漂亮排序算法,但经过证明,Stooge 排序的性能是慢于冒泡排序的。


    v2-566b53fb4e5c951965c0d7b2994870ed_b.gif


    顾名思义, 漂亮排序算法 它的代码实现 看、上、去 很整齐很好看

            //@程序员小吴 在《算法导论》第 2 版第 95 页,里面使用的是 i 和 j,为了
    //更好理解,我在这里使用了 low 和 high 进行代替
    private static void stoogeSort(int[] A, int low, int high){
        if(A[low] > A[high]) swap(A, low, high);
        if(low + 1 >= high ) return;
        int split = (high - low + 1) / 3;
        stoogeSortDo(A, low, high - split);
        stoogeSortDo(A, low + split, high);
        stoogeSortDo(A, low, high - split);
    }
    
          

    通过图片你可能更能直观的看出它的好看。

    v2-b01372ee6c678f5f96fd6b69ca0b792f_b.jpg


    代码整体的思路就是基于递归来实现的,具体操作就是:对于传入的数组先将头部与尾部进行排序,然后递归调用排序前三分之二,再递归调用排序后三分之二,最后再递归调用排序前三分之二

    动画描述如下:

    1.第一步:对传入的数组的头尾元素进行比较


    v2-bd872db2f978f46a65dbeddc27a69843_b.gif


    2.第二步:判断能否三等分,如果可以则将数组三等分


    v2-0035dcadb9998814f95e37f791a6d3af_b.jpg


    3.第三步:同样的逻辑递归的排序数组的 2 / 3 区域


    v2-290ce59103e2f536866ec340f63683d2_b.jpg


    4.第四步:同样的逻辑递归的排序数组的 2 / 3 区域


    v2-011302d598e46656e0c6792d82ff4ee0_b.jpg


    5.第五步:同样的逻辑再次递归的排序数组的 2 / 3 区域


    v2-d95c3c7b46bc20d73e74e0f299e01b54_b.jpg


    排序完成!

    这个算法的复杂度为 T(n) = 3 T( 2n / 3 ) + 1,已被其它大牛证明时间复杂度接近于 O(n2.71) ,对比于一般的排序算法,比如冒泡、选择等常见的 O(n2) 排序算法,排序过程上慢很多。

    所以,它除了好看,目前也没发现有啥用。

    再补充一个有趣的点,这个算法也被称之为 臭皮匠算法: 三个臭皮匠顶个诸葛亮(在代码实现中涉及到三等分这个概念)。

    v2-f676b3e171a217a04d338add8f366dd3_b.jpg

  • 相关阅读:
    玩转Redis之Window安装使用(干货)
    如何用AJax提交name[]数组?
    Java中native关键字使用
    Kafka — 高吞吐量的分布式发布订阅消息系统【转】
    Permission denied: user=dr.who, access=READ_EXECUTE, inode="/tmp":student:supergroup:drwx------权限问题
    hdfs中删除文件、文件夹、抓取内容
    1. hadoop使用启动命令时报错之分析解决
    第三次迭代会议
    IAR Embedded Workbench for ARM 8.22.1 基础使用教程
    个人作业1——四则运算题目生成程序(基于java)
  • 原文地址:https://www.cnblogs.com/csnd/p/16675360.html
Copyright © 2020-2023  润新知