一次偶然的機會看見了睡眠排序,很有意思的一種排序演算法,可以說是對我們熟悉的正規排序的一種挑戰,是思想上的突破,有點像腦筋急轉彎。使用睡眠排序演算法,只能按照從小到大的順序排列。列印數組中的資料時,按照其大小sleep,這樣,數越大sleep的時間也就越長。所有的數同時進入sleep狀態,數比較小的會提前列印出來。近期使用的都是GO語言,對其並發也有了些許理解,所以,使用go語言來實現這種排序,是很不錯的選擇。
// test project main.gopackage mainimport ("fmt""time")var flag boolvar container chan boolvar count int func main() {flag = truecontainer = make(chan bool, 7)var arrays []int = []int{25, 12, 36, 24, 96, 54, 28}var i intfor i = 0; i < len(arrays); i++ {go tosleep(arrays[i])}go listen(len(arrays))for flag {time.Sleep(1e9)}}func listen(size int) {for flag {select {case <-container:count++if count >= size {flag = falsebreak}}}}func tosleep(data int) {time.Sleep(time.Duration(data))fmt.Println(data)container <- true}
本來以為三兩下就能寫完,結果卻用了將近半個小時,難倒我的地方在於怎樣有效將程式停止。用了一個container channel來儲存某些資料已經列印結束了,當container中資料有數組那麼多時,說明資料已經全部列印完畢,程式可以退出了。期間犯了個小錯誤,沒有指定channel的capacity,導致阻塞。