最近在網上看到一則SleepSort演算法(用Shell指令碼寫的):代碼如下:
----------------------------------------------------------------------------
#!/bin/bashfunction f() { sleep "$1" echo "$1"}while [ -n "$1" ]do f "$1" & shiftdonewait----------------------------------------------------------------------------- |
用法如下:
./sleepsort.bash 1 4 7 3 8 9 2 6 5
| 分析:核心思想是:根據資料讀入的資料大小確定休眠時間,從而可以根據資料大小正確排序了。 |
負數或浮點數就有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----------------------------------------------------------------------------更有勝者實現了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));
}
};-----------------------------------------------------------------------------
據此核心思想,實現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.print(ms+" "); }}-------------------------------------------------------------------------------------------