前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你知道什么是漂亮排序法吗?哦,知道,不就是臭皮匠排序法嘛!

你知道什么是漂亮排序法吗?哦,知道,不就是臭皮匠排序法嘛!

作者头像
五分钟学算法
发布2019-06-13 12:43:16
7470
发布2019-06-13 12:43:16
举报
文章被收录于专栏:五分钟学算法五分钟学算法

在《算法导论》第二版第 7 章(快速排序)的思考题(第 95 页)中提及到一种 低效的递归排序算法:Stooge 排序, Howard、Fine 等教授将这个算法称为 漂亮排序算法(完美排序算法)。

经过证明,Stooge 排序的性能是慢于冒泡排序的,因为这个,在《算法导论》中作者悄悄的 “diss” 了一下这几位终生教授,“怀疑”他们是否“名副其实”。

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

代码语言:javascript
复制
//@程序员小吴 在《算法导论》第 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;
    stoogeSort(A, low, high - split);
    stoogeSort(A, low + split, high);
    stoogeSort(A, low, high - split);
}

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

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

动画描述

1.第一步:对传入的数组的头尾元素进行比较
2.第二步:判断能否三等分,如果可以则将数组三等分
3.第三步:同样的逻辑递归的排序数组的前 2 / 3 区域
4.第四步:同样的逻辑递归的排序数组的后 2 / 3 区域
5.第五步:同样的逻辑再次递归的排序数组的前 2 / 3 区域

排序完成!

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

所以,它除了好看,目前也没发现有啥用:一顿操作瞎装逼,一看性能二点七

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

如果你对这种奇葩排序感兴趣的话,不妨点击下面两个链接看看,涉及到猴子排序、面条排序、鸡尾酒排序等各种奇葩排序的动画描述。

你还知道哪些奇葩算法?欢迎留言告诉小吴。

动画:什么是鸡尾酒排序和地精排序?

这些奇葩的排序算法,你没见过动画吧?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 五分钟学算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 动画描述
    • 1.第一步:对传入的数组的头尾元素进行比较
      • 2.第二步:判断能否三等分,如果可以则将数组三等分
        • 3.第三步:同样的逻辑递归的排序数组的前 2 / 3 区域
          • 4.第四步:同样的逻辑递归的排序数组的后 2 / 3 区域
            • 5.第五步:同样的逻辑再次递归的排序数组的前 2 / 3 区域
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档