最近在網上看到一則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/bashfunction f() { sleep $(echo "($2 - 1) + $1 / 10 ^ $2" | bc -l) echo "$1"}while [ -n "$1" ]do f "$1" $(echo -n "$1" | wc -c) & shiftdonewait----------------------------------------------------------------------------更有勝者實現了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+" "); }}-------------------------------------------------------------------------------------------