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

2018 年 11 月 5 日 架构师之路

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


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+两次递归,也是小的元素往前端走,大的元素往后端走,直至完成排序。


希望这一分钟,大家有收获。

架构师之路-分享可落地的技术文章


推荐阅读:

TopK与快速排序深度解析

搞定所有时间复杂度计算

拜托,面试别再问我基数排序了!

拜托,面试别再问我计数排序了!

拜托,面试别再问我桶排序了!


作业:在自己的电脑上,实现6行的完美排序,今后面试手写排序不再是问题

登录查看更多
0

相关内容

排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。分内部排序和外部排序。若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。内部排序的过程是一个逐步扩大记录的有序序列长度的过程。
专知会员服务
139+阅读 · 2020年5月19日
机器学习速查手册,135页pdf
专知会员服务
338+阅读 · 2020年3月15日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
192+阅读 · 2020年3月12日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
Github标星4w+,如何用Python实现所有算法
七月在线实验室
5+阅读 · 2019年5月21日
经验分享 | SLAM、3D vision笔试面试问题
计算机视觉life
24+阅读 · 2019年5月1日
Github标星2w+,热榜第一,如何用Python实现所有算法
大数据文摘
7+阅读 · 2019年4月28日
读扩散?写扩散?推拉架构一文搞定!
架构师之路
16+阅读 · 2019年2月1日
这些论文绘图软件,你一个都不会用
算法与数学之美
8+阅读 · 2018年8月17日
图解高等数学|线性代数
遇见数学
39+阅读 · 2017年10月18日
相似图片搜索的原理
数据库开发
9+阅读 · 2017年8月11日
The Matrix Calculus You Need For Deep Learning
Arxiv
12+阅读 · 2018年7月2日
Arxiv
3+阅读 · 2018年4月18日
Arxiv
3+阅读 · 2018年4月5日
VIP会员
相关VIP内容
专知会员服务
139+阅读 · 2020年5月19日
机器学习速查手册,135页pdf
专知会员服务
338+阅读 · 2020年3月15日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
192+阅读 · 2020年3月12日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
相关资讯
Github标星4w+,如何用Python实现所有算法
七月在线实验室
5+阅读 · 2019年5月21日
经验分享 | SLAM、3D vision笔试面试问题
计算机视觉life
24+阅读 · 2019年5月1日
Github标星2w+,热榜第一,如何用Python实现所有算法
大数据文摘
7+阅读 · 2019年4月28日
读扩散?写扩散?推拉架构一文搞定!
架构师之路
16+阅读 · 2019年2月1日
这些论文绘图软件,你一个都不会用
算法与数学之美
8+阅读 · 2018年8月17日
图解高等数学|线性代数
遇见数学
39+阅读 · 2017年10月18日
相似图片搜索的原理
数据库开发
9+阅读 · 2017年8月11日
Top
微信扫码咨询专知VIP会员