一千万个随机数排序,如何24秒蜕变成3秒?如何从700M内存消耗变成200M?

前端之家收集整理的这篇文章主要介绍了一千万个随机数排序,如何24秒蜕变成3秒?如何从700M内存消耗变成200M?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. 上一篇文章写的十分的烂,经过科普看语言源码实现用的是quicksort实现的底层排序,在这里模仿一下,勿喷!
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "math/rand"
  6. "runtime"
  7. "sort"
  8. "time"
  9. )
  10.  
  11. func mergeonce(l,r []int) []int {
  12. m := make([]int,len(l)+len(r))
  13. i,j := 0,0
  14. if i < len(l) && j < len(r) {
  15. for {
  16. if l[i] < l[j] {
  17. m = append(m,l[i])
  18. i++
  19. if i == len(l) {
  20. break
  21. }
  22. } else {
  23. m = append(m,l[j])
  24. j++
  25. if j == len(r) {
  26. break
  27. }
  28. }
  29. }
  30. }
  31. m = append(append(m,l[i:]...),r[j:]...)
  32. return m
  33. }
  34.  
  35. func merge(in chan []int,out chan []int) {
  36. var next chan []int
  37. var l []int
  38. for list := range in {
  39. if l == nil {
  40. l = list
  41. continue
  42. }
  43.  
  44. r := list
  45.  
  46. if next == nil {
  47. next = make(chan []int,1)
  48. go merge(next,out)
  49. }
  50.  
  51. next <- mergeonce(l,r)
  52. l = nil
  53. }
  54. if next == nil {
  55. out <- l
  56. } else {
  57. if l != nil {
  58. next <- l
  59. }
  60. close(next)
  61. }
  62. }
  63.  
  64. func main() {
  65. runtime.GOMAXPROCS(2)
  66. ch := make(chan []int,1)
  67.  
  68. const Num = 100
  69. const WNum = 100
  70. fmt.Println(time.Now())
  71. go func(n int,out chan []int) {
  72. for i := 0; i < n; i++ {
  73. list := make([]int,1000)
  74. for j := range list {
  75. list[j] = rand.Int()
  76. }
  77.  
  78. sort.Ints(list)
  79. out <- list
  80. }
  81. close(out)
  82. }(Num*WNum,ch)
  83.  
  84. out := make(chan []int)
  85. go merge(ch,out)
  86. list := <-out
  87. fmt.Println(time.Now())
  88. fmt.Println(len(list))
  89. fmt.Println(sort.IntsAreSorted(list))
  90. }

猜你在找的Go相关文章