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

开发 开发工具 算法
完美排序的排序证明,不在文章中展开。从代码直观能感受到,通过swap和三次递归,趋势上,小的元素会往前端走,大的元素会往后端走,直至完成排序。

[[248668]]

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

  1. void stooge_sort(int arr[], int i, int j){ 
  2.          if (arr[i]>arr[j]) swap(arr[i], arr[j]); 
  3.          if (i+1>=j) return; 
  4.   
  5.          int k=(j-i+1)/3; 
  6.          stooge_sort(arr, i, j-k); 
  7.          stooge_sort(arr, i+k, j); 
  8.          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半区。

排序结束。

神奇不神奇!!!

再看一遍,印象深刻不?

  1. void stooge_sort(int arr[], int i, int j){ 
  2.          if (arr[i]>arr[j]) swap(arr[i], arr[j]); // 比较 
  3.          if (i+1>=j) return; // 是否结束 
  4.   
  5.          int k=(j-i+1)/3; // 三等分 
  6.          stooge_sort(arr, i, j-k); // 前2/3半区 
  7.          stooge_sort(arr, i+k, j); // 后2/3半区 
  8.          stooge_sort(arr, i, j-k); // 前2/3半区 

然并卵,除了代码好看,完美排序毛用没有,因为它是一个挺慢的算法。

由代码很容易看出来:

  • 当只有1个元素时,完美排序的时间也是1;
  • 当有n个元素时,完美排序由一个常数计算,加上三次递归,每次递归数据量为(2/3)*n;

即,其时间复杂度递归式为:

  • T(1) = 1;
  • T(n) = 3T(2/3n) + 1;

使用《搞定所有时间复杂度计算》中的递归式计算方法,最终得到,完美排序的时间复杂度是O(n^2.7),比O(n^2)的排序都要慢。

完美排序的排序证明,不在文章中展开。从代码直观能感受到,通过swap和三次递归,趋势上,小的元素会往前端走,大的元素会往后端走,直至完成排序。

画外音:快速排序的过程是partition+两次递归,也是小的元素往前端走,大的元素往后端走,直至完成排序。

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

【本文为51CTO专栏作者“58沈剑”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2021-11-30 14:06:37

排序算法代码

2023-07-31 08:59:46

软件FossilSQLite

2010-09-02 13:21:46

2013-04-24 09:57:08

Excel微软

2013-06-09 08:52:50

哈希表

2014-09-05 09:08:58

2015-11-25 09:41:05

数据中心

2014-02-11 09:58:19

环保数据中心泰坦

2013-07-09 10:11:41

程序设计大赛程序员

2024-01-11 09:11:08

数据库SQLite管理

2013-05-08 09:38:28

InteropNetSDN网络设备供应商

2018-12-04 15:46:53

编程语言Python

2018-07-19 19:07:33

语言编程语言程序

2009-09-11 10:41:36

数据中心

2017-12-04 23:25:24

2009-12-14 16:38:07

自主研发机器人

2019-11-18 15:07:54

编程语言C#

2023-02-28 08:59:47

PythonJavaJavaScript

2013-09-16 11:12:51

编程环境开发

2023-06-28 11:14:18

点赞
收藏

51CTO技术栈公众号