哈嘍,大家好,我是不務正業的吳師兄,今天給大家找點樂子,分享幾個好玩的排序算法。
睡眠排序
根據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源創計劃”,歡迎正在閱讀的你也加入,一起分享。