mergesort.go 859 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "time"
  6. )
  7. type ints []int
  8. func (is ints) merge(aux []int, lo, mid, hi int) {
  9. for i, j, k := lo, mid+1, lo; k <= hi; k++ {
  10. if mid < i {
  11. aux[k] = is[j]
  12. j++
  13. } else if hi < j {
  14. aux[k] = is[i]
  15. i++
  16. } else if is[i] < is[j] {
  17. aux[k] = is[i]
  18. i++
  19. } else {
  20. aux[k] = is[j]
  21. j++
  22. }
  23. }
  24. copy(is[lo:hi+1], aux[lo:hi+1])
  25. }
  26. func (is ints) msort(aux []int, lo, hi int) {
  27. if hi <= lo {
  28. return
  29. }
  30. mid := lo + (hi-lo)/2
  31. is.msort(aux, lo, mid)
  32. is.msort(aux, mid+1, hi)
  33. is.merge(aux, lo, mid, hi)
  34. }
  35. func (is ints) sort() {
  36. l := len(is)
  37. aux := make([]int, l)
  38. is.msort(aux, 0, l-1)
  39. }
  40. func main() {
  41. var n int
  42. fmt.Scan(&n)
  43. var list ints = make([]int, n)
  44. rand.Seed(time.Now().Unix())
  45. for i := range list {
  46. list[i] = rand.Intn(2 * n)
  47. }
  48. fmt.Println(list)
  49. list.sort()
  50. fmt.Println(list)
  51. }