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

简介: 直奔主题,世界上“最漂亮”的排序算法。 void stooge_sort(int arr[], int i, int j){          if (arr[i]>arr[j]) swap(arr[i], arr[j]);          if (i+1>=j) return;        .

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

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等几个教授提出,之所以称为“完美排序”,是因为其代码实现优雅、工整、漂亮

代码不是很好理解,一步步讲解下思路。

8a78dc9ad2e054bc111825e77a6dd985dba1b912

首先,排序传入的参数是待排序的数组arr[i, j];

920be5e1ff0c998e245f64188dd39cc346f87f98

第一步:比较i与j位置的元素,根据排序规则决定是否进行置换

画外音:本栗子,假设排序规则是从小到大。

置换完成后,判断排序是否结束,当i和j相邻时,排序结束。

e912e8235bddcc8b6d5a7f5dc4621483d6ff6ae5

第二步:将arr[i, j]三等分

画外音:总元素个数是j-i+1。

6882d259ab2e602bd8bf0dad62faf40213af6969

第三步:递归arr的2/3半区。

48c675430568b300d72d16d470841858a1d126df

第四步:递归arr的2/3半区。

4b0310e0b1a1b450eeae3434cd507da78514e629

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

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


原文发布时间为:2018-11-05

本文作者: 58沈剑

本文来自云栖社区合作伙伴“架构师之路”,了解相关信息可以关注“架构师之路”。

相关文章
|
20天前
|
搜索推荐 算法 Java
常见的排序算法
简介:本文介绍了排序算法的基础知识,包括常见的几种排序方法及其时间复杂度,特别区分了基于比较和非比较的排序算法。对于初学者,建议掌握基本概念;而对于进阶学习者,则需深入了解各类算法的特点、适用场景及其实现细节,如快排、归并在不同数据条件下的表现,以及非比较排序算法在特定情况下的优势。
21 0
|
6月前
|
搜索推荐 算法 Python
排序算法(2)
排序算法(2)
|
7月前
|
搜索推荐
常见的几种排序算法
常见的几种排序算法
62 1
|
搜索推荐 算法 Shell
排序算法
排序算法
42 1
|
7月前
|
搜索推荐 算法
常见排序算法实现(二)
常见排序算法实现(二)
59 0
|
搜索推荐 Java C++
简单介绍排序算法
简单介绍排序算法
50 0
|
搜索推荐 算法 C#
c#排序算法
c#排序算法
|
搜索推荐
排序算法总结
经典排序算法总结
69 0
|
搜索推荐 算法
|
搜索推荐 算法 测试技术