排序算法 Sleep Sort 多線程、多進程排序啊

wmhx 13年前發布 | 3K 次閱讀

排序算法好像是程序員學習編程最多的算法,也可能是算法研究者們最喜歡研究的算法了。排序有很多很多的算法,比如,冒泡,插入,選擇,堆,快速,歸并等等(你可以看看本站以前的那些文章:可視化的排序,排序算法比較,顯示排序過程的python)這里向大家介紹一個“巨NB”的排序算法——Sleep Sort。

閑言少說,請看下面的代碼(用Shell腳本寫的)

 #!/bin/bash
function f() {
sleep "$1"
echo "$1"
}
while [ -n "$1" ]
do
f "$1" &
shift
done
wait

用法如下:

./sleepsort.bash 5 3 6 3 6 3 1 4 7

相信你可以會去試一下這個腳本,也相你你試完后你一定會說——“我擦,真TMD排序了!”,我還是不要解釋這段代碼了,過多的解釋會不如代碼那么直接,而且解釋會影響你對這個排序算法的NB性。只想說——這是正二八經的多線程、多進程排序啊。我們的Bogo排序也黯然失色啊。

下面我們需要對這個算法做一些分析——

1)讓我們來分析一個這這個程序的算法復雜度,太簡單了,不就是O(最大數的秒數),呵呵。所以,如果出現這樣的數列將是惡夢的——2 1 4 3 2 1 99999999

2)這個排序好是好,但對于負數或浮點數就有bug了。負數的解決方案是,我們可以這樣來:x/2+MaxInt/2(時間可能相當長,不過依然工作)。對于浮點數,看看下面的代碼.

 #!/bin/bash
function f() {
sleep $(echo "($2 - 1) + $1 / 10 ^ $2" | bc -l)
echo "$1"
}
while [ -n "$1" ]
do
f "$1" $(echo -n "$1" | wc -c) &
shift
done
wait

3)我們來看看各種語言版本的實現吧。
Java

 public class SleepSort { 
public static void main(String[] args) { 
int[] ints = {1,4,7,3,8,9,2,6,5}; 
SortThread[] sortThreads = new SortThread[ints.length]; 
for (int i = 0; i < sortThreads.length; i++) { 
sortThreads[i] = new SortThread(ints[i]); 
} 
for (int i = 0; i < sortThreads.length; i++) { 
sortThreads[i].start(); 
} 
} 
} 
class SortThread extends Thread{ 
int ms = 0; 
public SortThread(int ms){ 
this.ms = ms; 
} 
public void run(){ 
try { 
sleep(ms*10+10); 
} catch (InterruptedException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
System.out.println(ms); 
} 
} 


 

 

Javascript

 

function sleepsort() { 
for (var i = 0, il = arguments.length; i < il; i++) { 
(function(args, index) { 
setTimeout(function() { 
document.body.innerHTML += args[index] + ', '; 
}, args[index]); 
}(arguments, i)); 
} 
}; 


 

 

類似這樣的文章,很有意思,包括評論哦.
http://coolshell.cn/articles/4883.html

 

 本文由用戶 wmhx 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!