排序算法 Sleep Sort 多線程、多進程排序啊
排序算法好像是程序員學習編程最多的算法,也可能是算法研究者們最喜歡研究的算法了。排序有很多很多的算法,比如,冒泡,插入,選擇,堆,快速,歸并等等(你可以看看本站以前的那些文章:可視化的排序,排序算法比較,顯示排序過程的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
 wmhx                              quguiliang
 quguiliang                              yanguz123
 yanguz123                              wf1006
 wf1006