gochannel实现排序

题目来源: 映客

答案1:

应该是使用channel实现一个并归排序

  1. func Merge(ch1 <-chan int, ch2 <-chan int) <-chan int {
  2. out := make(chan int)
  3. go func() {
  4. // 等上游的数据 (这里有阻塞,和常规的阻塞队列并无不同)
  5. v1, ok1 := <-ch1
  6. v2, ok2 := <-ch2
  7. // 取数据
  8. for ok1 || ok2 {
  9. if !ok2 || (ok1 && v1 <= v2) {
  10. // 取到最小值, 就推到 out 中
  11. out <- v1
  12. v1, ok1 = <-ch1
  13. } else {
  14. out <- v2
  15. v2, ok2 = <-ch2
  16. }
  17. }
  18. // 显式关闭
  19. close(out)
  20. }()
  21. // 开完goroutine后, 主线程继续执行, 不会阻塞
  22. return out

参考资料

https://blog.csdn.net/weixin\_34122548/article/details/88005287