惊叹!世界上最漂亮的排序算法!

直奔主题,世界上“最漂亮”的排序算法,只有6行。

void stooge_sort(int arr[], int i, int j){

         if (arr[i]>arr[j]) swap(arr[i], arr[j]);

         if (i+1>=j) return;

 

         int k=(j-i+1)/3;

         stooge_sort(arr, i, j-k);

         stooge_sort(arr, i+k, j);

         stooge_sort(arr, i, j-k);

}

 
《算法导论》习题中的“完美排序”,由Howard、Fine等几个教授提出,之所以称为“完美排序”,是因为其代码实现优雅、工整、漂亮
 
代码不是很好理解,一步步讲解下思路。
惊叹!世界上最漂亮的排序算法!
首先,排序传入的参数是待排序的数组arr[i, j];
 
惊叹!世界上最漂亮的排序算法!
第一步:比较i与j位置的元素,根据排序规则决定是否进行置换
画外音:本栗子,假设排序规则是从小到大。
置换完成后,判断排序是否结束,当i和j相邻时,排序结束。
 
惊叹!世界上最漂亮的排序算法!
第二步:将arr[i, j]三等分
画外音:总元素个数是j-i+1。
 
惊叹!世界上最漂亮的排序算法!
第三步:递归arr的2/3半区。
 
惊叹!世界上最漂亮的排序算法!
第四步:递归arr的2/3半区。
 
惊叹!世界上最漂亮的排序算法!
第五步:递归arr的2/3半区。
 
排序结束。

神奇不神奇!!!
再看一遍,印象深刻不?

void stooge_sort(int arr[], int i, int j){

         if (arr[i]>arr[j]) swap(arr[i], arr[j]); // 比较

         if (i+1>=j) return; // 是否结束

 

         int k=(j-i+1)/3; // 三等分

         stooge_sort(arr, i, j-k); // 前2/3半区

         stooge_sort(arr, i+k, j); // 后2/3半区

         stooge_sort(arr, i, j-k); // 前2/3半区

}

 
然并卵,除了代码好看,完美排序毛用没有,因为它是一个挺慢的算法。
 
由代码很容易看出来:
(1)当只有1个元素时,完美排序的时间也是1;
(2)当有n个元素时,完美排序由一个常数计算,加上三次递归,每次递归数据量为(2/3)*n;
 
即,其时间复杂度递归式为:
T(1) = 1;
T(n) = 3T(2/3n) + 1;
 
通过递归式计算方法,最终得到,完美排序的时间复杂度是O(n^2.7),比O(n^2)的排序都要慢。
 
完美排序的排序证明,不在文章中展开。从代码直观能感受到,通过swap和三次递归,趋势上,小的元素会往前端走,大的元素会往后端走,直至完成排序
画外音:快速排序的过程是partition+两次递归,也是小的元素往前端走,大的元素往后端走,直至完成排序。
希望这一分钟,大家有收获。
架构师之路-分享可落地的技术文章
只有6行的完美排序,学到了吗?

画外音:今后面试手写排序不再是问题

发布者:糖太宗,转载请注明出处:https://www.qztxs.com/archives/science/technology/5991

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年5月11日 下午8:12
下一篇 2022年5月11日 下午8:13

相关推荐

  • 系统通知,居然用拉取?

    广义系统通知,有1对1的通知,以及一对多的通知,有相对实时的业务通知,也有能够容忍一定延时的系统通知。任何脱离业务场景的架构设计都是耍流氓,结合具体的场景来看下,这样的一些系统通知,究竟是推还是拉?   第一大类:系统对1的通知 典型业务,计数类通知: (1)有10个美女添加了你为好友; (2)有8个好友私信了你; 很多业务经常有这类计数通知,通知结果只针对...

    技术 2022年5月15日
    2200
  • 修改正在运行的docker容器的端口映射

    0x00 前言 在创建容器时,只有自己本地使用,端口映射127.0.0.1 后面有同事也需要用这个,想要修改正在运行的容器的端口映射   0x01 修改端口映射 1. 确定修改容器的CONTAINER ID 1 2 3 # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NA...

    技术 2022年6月1日
    2400
  • 订单中心,1亿数据架构,这次服了

    订单中心,是互联网业务中,一个典型的“多key”业务,即:用户ID,商家ID,订单ID等多个key上都有业务查询需求。   随着数据量的逐步增大,并发量的逐步增大,订单中心这种“多key”业务,架构应该如何设计,有哪些因素需要考虑,是本文将要系统性讨论的问题。   什么是“多key”类业务? 所谓的“多key”,是指一条元数据中,有多个属性上存在前台在线查询...

    2022年5月14日
    1900
  • Redis的一些漏洞复现利用

    0x00 Redis REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构服务器,因为值(...

    2022年6月13日
    3800
  • 很多人问,到底要不要转管理?

    想要成为一名管理者,并不是做个决定这么简单,做管理需要一套完全不同的技能。好的架构师,好的技术专家,并不一定代表一个好的管理者。   如何确定自己是不是适合管理岗位呢?可以先问问自己下面五个问题。   问题1:你的兴趣在哪,技术专家,还是带团队? 有没有想过自己五年后在做什么,届时是否工作得开心?   做技术专家,带团队做事情,还是自己创业,搞清楚自己想要什...

    技术 2022年5月15日
    2400

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信