奇怪的排序算法

睡眠排序(Nipun Ramakrishnan 的回答)

這個搞笑算法流傳於 4chan 的 /prog/ 板塊。無從查證具體出自哪位程序員,僞代碼如下

procedure printNumber(n)

    sleep n seconds

    print n

end

 

for arg in args

    run printNumber(arg) in background

end

wait for all processes to finish


算法運行如下: 對於數組中每個元素 x,開啓一個新程序:

  • 休眠 x 秒

  • 打印 x 所有元素同時開始計時。 只適用於非負數字。


Bogo 排序/猴子排序 (Ryan Turner的回答)

Bogo 排序/猴子排序,名字很奇怪。它是愚蠢排序中的一員。

主要來說,算法就是你把元素隨機排列。

如果沒有排好序,再次把元素隨機排列。

如果還沒有排好序,你懂的。下面是個例子:

4, 7, 9, 6, 5, 5, 2, 1 (未排序)

2, 5, 4, 7, 5, 9, 6, 1 (隨機排列)

1, 4, 5, 6, 9, 7, 5, 2 (再次隨機排列)

1, 2, 4, 5, 5, 6, 7, 9 (天吶,真幸運)


你不停地隨機排序,直到得到一個有序數組。

毫無疑問這是最低效的排序算法之一,除非你非常非常幸運。它時間複雜度是令人窒息的 O(n!),而且隨着元素數量增加,很有 O(∞) 的趨勢。

量子 Bogo 排序(Tyler Schroeder 的回答)

我是量子 Bogo 排序的粉絲:

  • 隨機排列數組中元素。

  • 如果數組沒有排好序,摧毀當前宇宙(這一步就拜託你了)

  • 存活的宇宙將會有排好序的數組。 時間複雜度僅僅 O(n) 注意:這種算法依賴於量子力學的平行宇宙理論的可靠性。如果量子力學的平行宇宙理論不準確,這個算法時間複雜度達不到 O(n)


打印店頁碼排序 (Yi Wang的回答)

這並不是我發明的,我從別處看到的。

一個學生去打印店打印材料。他需要兩份,但並沒有直接打印兩份,而是將每一頁打印了兩次,像下面這樣:

需要的頁碼順序: 1 2 3 4 … N; 1 2 3 4 … N

手上的頁碼順序: 1 1 2 2 3 3 4 4 …. N N

他開始對打印材料排序,取一頁放在左邊,然後取一頁放在右邊。打印店老闆看不下去了,直接把材料拿過來。

老闆首先取一頁放在左邊,然後兩頁放在右邊,再然後兩頁左邊,兩頁右邊…… 排序速度瞬間翻倍 ……

(有網友評論提醒:這是歸納,不是排序)

下面是其他網友的回答:

慢排序

這是一個非常幽默卻沒什麼用的排序算法。它基於“合而不治”的原則(分治算法基本思想“分而治之”的反義詞,文字遊戲),它由 Andrei Broder 和 Jorge Stolfi 於 1986 年發表在論文《Pessimal Algorithms and Simplexity Analysis(最壞排序和簡單性分析)》中,僞代碼如下:

function slowSort(array,start,end){

    if( start >= end ) return; //已經不能再慢了

    middle = floor( (start+end)/2 );

 

    //遞歸

    slowSort(array,start,middle);

    slowSort(array,middle+1,end);

 

    //比較得出最大值放在隊尾

    if( array[end] < array[middle] )

        swap array[end] and array[middle]

 

    //去掉最大值之後再排序

    slowsort(array,start,end-1);

}


  • 遞歸排序好前一半

  • 遞歸排序好後一半

  • 比較中間和隊尾的值,得到整個數組的最大值,將最大值放到隊尾。

  • 去掉最大值,遞歸整個數組


Stack 排序

從 StackOverflow 上搜索標題含有“數組排序”的帖子,複製粘貼並運行其中的代碼片段,直到數組排好序。我認爲這種排序算法事實上驗證了整個數組。它被髮表在xkcd網站上,這裏有一個在線版的具體實現stacksort

隨機排序

運行如下: 創建一個隨機程序。 傳入數組並運行隨機程序。 如果程序的輸出恰好是排好序的,完成。 否則重複上面過程。

太陽能比特翻轉排序

太陽發出的阿爾法粒子偶爾能夠翻轉內存中的比特位,所以這種算法主要基於希望這種翻轉能夠使元素正確排序。運行方式如下:

檢查數組是否排好序。 如果排好序,返回這個數組。 如果沒有,等 10 秒鐘並祈禱太陽輻射使得比特位翻轉,而且使得數組排好序,重複第一步。

意大利麪排序

這是一種線性時間算法,是需要 O(n) 空間的穩定排序。它需要並行處理器。簡單來說,假設我們排序一列自然數。排序方法需要使用很多根生的意大利麪條。


將數據按比例轉換成表示意大利麪條長度的數字。 在每根麪條上寫下數字,並將麪條折斷成數字表示的長度。 把所有面條攥成一捆並把底部在平面上敲擊。 取出最突出的一根麪條,也就是最長的一根,獲取上面的數字,轉換成原始的數據並記錄下來。 重複這個過程直到處理完所有意大利麪。

指鹿爲馬排序

這個算法時間複雜度 O(n)。 聚集一幫人並向他們展示數組。 詢問他們這個數組是否是排序好的。 幹掉其中認爲沒有排序好的人。 重複幾次,直到所有人同意這個數組是排序好的。

智能設計排序

無論你的數組狀態是什麼樣的,它都算是排好序的。 解釋:原始輸入按照某種順序的概率是 1/(n!)。概率是如此小,(當前的順序)歸結於運氣成分顯然是荒謬的,所以它是按照“智能設計”排序過的。所以完全可以說數組已經排好序了,只是不是我們傳統意義上的“升序”。如果按照我們傳統觀點對它進行操作,只會讓它亂序。(“智能設計”涉及宗教和哲學,不過多解釋)

互聯網排序

這是一種冒泡排序,但每次比較都依靠互聯網的搜索。比如 “0.211 和 0.75 哪個大?”

委員會排序

排序一個包含 N 個自然數的數組,首先用紙打印出 N 份整個數組。 然後在辦公室周圍選擇幾個恰好路過的倒黴委員。每個委員對應數組中的一個數字。 給每個委員一份打印的數組,並讓他們通過開會或其他手段,來決定自己代表的數字應該在有序數組中的位置。 當這些委員有結論並答覆你時,數組自然排好序了。

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