笑了。。。

哈嘍,大家好,我是不務正業的吳師兄,今天給大家找點樂子,分享幾個好玩的排序算法。

睡眠排序

根據CPU的調度算法實現的,對一組數據進行排序,不能存在負數值,這個數是多大,那麼就在線程裏睡眠它的10倍再加10,不是睡眠和它的數值一樣大的原因是,當數值太小時,誤差太大,睡眠的時間不比輸出的時間少,那麼就會存在不正確的輸出結果。


猴子排序

隨機打亂數組,檢查是否排好序,若是,則輸出,否則再次打亂,再檢查…最佳情況O(n),平均O(n*n!),最壞可執行直到世界的盡頭。


一個有趣的理論:一隻猴子隨機敲打打字機鍵盤,如果時間足夠長,總是能打出特定的文本,比如莎士比亞全集。

麪條排序

首先去買一捆麪條,我喜歡手擀麪。找到數組中最大和最小的兩個數(O(n)),讓最大的數對應一根很長的麪條,最小的數對應一根很短的麪條。

重新遍歷數組,每遇到一個數,就取一根麪條,把它切成這個數對應的長度,可以得到n根麪條。這裏的數與麪條長度的對應可以用一個嚴格遞增的函數來映射。

接下來,一手握住這n根麪條,稍微用力,別握太緊,在平放的桌面上直立着放下,讓所有的麪條底端接觸到桌面。另一隻手平行於桌面,從麪條上方緩慢往下移動,每當這隻手碰到一根麪條,移走它,並把對應的數輸出到結果數組中,直到移走全部麪條。

雞尾酒排序

雞尾酒排序,也就是定向冒泡排序,雞尾酒攪拌排序,攪拌排序(也可以視作選擇排序的一種變形),漣漪排序,來回排序或快樂小時排序,是冒泡排序的一種變形。

此算法與冒泡排序的不同處在於排序時是以雙向在序列中進行排序。

排序過程:

  • 先對數組從左到右進行冒泡排序(升序),則最大的元素去到最右端

  • 再對數組從右到左進行冒泡排序(降序),則最小的元素去到最左端

  • 以此類推,依次改變冒泡的方向,並不斷縮小未排序元素的範圍,直到最後一個元素結束

1、第一輪操作( 8 和 1 交換 )

2、第二輪操作 ( 從序列右邊開始遍歷 )

3、第三輪操作 ( 從左向右比較和交換 )

在這一輪操作中,沒有元素位置交換,證明已經有序,排序結束。

對比冒泡排序,雞尾酒排序只需要 3 輪操作就可以完成排序。

地精排序

Gnome 排序(地精排序),起初由 Hamid Sarbazi-Azad 於 2000 年提出,並被稱爲 stupid 排序,後來被 Dick Grune 描述並命名爲 “地精排序” 。

地精排序和插入排序類似,除了移動一個元素到最終的位置,是通過交換一系列的元素實現,就像冒泡排序一樣。概念上十分簡單,不需要嵌套循環。

時間複雜度爲O(n^2),但是如果初始數列基本有序,時間複雜度將降爲O(n)。實際上 Gnome 算法可以和插入排序算法一樣快。

平均運行時間爲O(n^2)。

將無序數列:6,2,4,1,5,使用地精排序使其從小到大排序。

通過設計標識 i = 0 ,然後從頭開始判斷,什麼時候 ( i < 4 ) 不成立,什麼時候排序結束。

這裏的核心點就是如何控制 i 的值

1、第一輪操作「i = 0」

先讓 i 自增 1 ,達到值爲 1 纔開始比較 :

交換前 [ 6 2 4 1 ] 『 i = 0 』

交換後 [ 6 2 4 1 ] 『 i = 1 』

第二輪操作「i = 1」

比較 6 和 2 ,發生交換,只要發生交換 i 就減 1 。

交換前 [ 6 2 4 1 ]『 i = 1 』

交換後 [ 2 6 4 1 ]『 i = 0 』

第三輪操作「i = 0」

i 變成 0 了,啥也不幹,自增變成 1 再說。

交換前 [ 2 6 4 1 ]『 i = 0 』

交換後 [ 2 6 4 1 ]『 i = 1 』

第四輪操作「i = 1」

比較 2 和 6 ,不交換,只要不要換就自增 1。

交換前 [ 2 6 4 1 ]『 i = 1 』

交換後 [ 2 6 4 1 ]『 i = 2 』

第五輪操作「i = 2」

比較 6 和 4 ,發生交換,只要發生交換 i 就減 1 。

交換前 [ 2 6 4 1 ]『 i = 2 』

交換後 [ 2 4 6 1 ]『 i = 1 』

第六輪操作「i = 1」

比較 2 和 4 ,不交換,只要不要換就自增 1 。

交換前 [ 2 6 4 1 ]『 i = 1 』

交換後 [ 2 4 6 1 ]『 i = 2 』

第七輪操作「i = 2」

比較 4 和 6 ,不交換,只要不要換就自增 1 。

交換前 [ 2 4 6 1 ]『 i = 2 』

交換後 [ 2 4 6 1 ]『 i = 3 』

第八輪操作「i = 3」

比較 6 和 1 ,發生交換,只要發生交換 i 就減 1 。

交換前 [ 2 4 6 1 ]『 i = 3 』

交換後 [ 2 4 1 6 ]『 i = 2 』

第九輪操作「i = 2」

比較 4 和 1 ,發生交換,只要發生交換 i 就減 1 。

交換前 [ 2 4 1 6 ]『 i = 2 』

交換後 [ 2 1 4 6 ]『 i = 1 』

第十輪操作「i = 1」

比較 2 和 1 ,發生交換,只要發生交換 i 就減 1 。

交換前 [ 2 1 4 6 ]『 i = 1 』

交換後 [ 1 2 4 6 ]『 i = 0 』

第十一輪操作「i = 0」

啥也不幹,先讓 i 自增1,達到值爲 1 纔開始真正的比較。

『 i = 1 』時,比較 1 和 2 ,不交換,只要不交換就自增 1 。
『 i = 2 』時,比較 2 和 4 ,不交換,只要不交換就自增 1 。
『 i = 3 』時,比較 4 和 6 ,不交換,只要不交換就自增 1 。
『 i = 4 』時,表達式 ( i < n ) 不成立,排序結束。

順序輸出爲 [ 1 2 4 6 ]。

你學會了麼。

本文分享自微信公衆號 - 五分鐘學算法(CXYxiaowu)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章