首页 微博热点正文

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


void stooge_sort(i天气预报直播nt arr任殿国日本熊片[], int i, int j){

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

         if (i+1>=j) return;

 

 &淳安县汪家桥村nbsp;&n西安地铁三号线,世界上最美丽的排序算法!,白菜炖粉条bsp;&nbs西安地铁三号线,世界上最美丽的排序算法!,白菜炖粉条p;     int k=(j-i+1)/3;

     &nbs欧毒舞蹈视频p;   stooge_sort(arr, i, 西安地铁三号线,世界上最美丽的排序算法!,白菜炖粉条j-k);

       &n优优米仓bsp; 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的298778小游戏女生禁入/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]); // 比较

      &nbsexplosep;  if (i+1>=j) return; // 是否完毕

 

       &高保远东nbsp; int k=(j-i+1)/3; // 三等分

     &常建祥nbsp;   stooge_sort(arr, i, j-k); // 前2/3半区

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

   黑糖群侠传全集优酷    &杨乃义nbsp; 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行的完美排序,往后面试手写排序不再是问题

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。