前几天看到一个博主翻译的一个算法,叫睡眠排序,原文链接:https://blog.csdn.net/zmazon/article/details/8514088
感觉这个算法十分有趣,在网上搜集了一些资料看一下都有什么脑洞大开的排序算法。
一:睡眠排序
原理:这个算法的核心思想就是对应多少个待排序的数字,就开多少个协程,让每个协程沉睡对应的数字时长(这里我让每个协程沉睡ms级别),沉睡之后打印对应数字,这样数字小的当然就先打印了,数字大的就后打印了,实现了排序功能。
代码如下:
package main
import (
"fmt"
"time"
)
func main() {
arr := []int{4, 3, 6, 8, 1, 5, 2, 9, 7, 34, 32, 53, 3}
n := len(arr)
ch := make(chan int, n) //用一个channel记录,防止主进程在有的协程还没有结束任务的时候就退出
for i := 0; i < n; i++ {
go func(t int) {
time.Sleep(time.Millisecond * time.Duration(t)) //沉睡对应的arr[i]ms
fmt.Println(t) //打印出来
ch <- i //协程打印数字之后传一个变量到channel
}(arr[i])
}
for i := 0; i < n; i++ {//等待所有的协程工作完毕
<- ch
}
return
}