排序

  1. package sort
  2. // 冒泡排序
  3. func Bubble(param []int) {
  4. limit := len(param) - 1
  5. for i := 0; i < len(param); i++ {
  6. for j := 0; j < limit; j++ {
  7. if param[j] <= param[j+1] {
  8. continue
  9. }
  10. param[j], param[j+1] = param[j+1], param[j]
  11. }
  12. limit--
  13. }
  14. }
  15. // 比较两个数组
  16. func CompareIntSlice(param1, param2 []int) bool {
  17. len1 := len(param1)
  18. len2 := len(param2)
  19. if len1 != len2 {
  20. return false
  21. }
  22. for i := range param1 {
  23. if param1[i] != param2[i] {
  24. return false
  25. }
  26. }
  27. return true
  28. }
  29. // 插入排序
  30. func Insertion(param []int) {
  31. for i := 1; i < len(param); i++ {
  32. curValue := param[i]
  33. for j := i - 1; j >= 0; j-- {
  34. if param[j] > curValue {
  35. param[j+1] = param[j]
  36. } else {
  37. param[j+1] = curValue
  38. break
  39. }
  40. }
  41. }
  42. }
  43. // 选择排序
  44. func Selection(param []int) {
  45. for i := 0; i < len(param)-1; i++ {
  46. minValueIdx := i
  47. for j := i + 1; j < len(param); j++ {
  48. if param[j] < param[minValueIdx] {
  49. minValueIdx = j
  50. }
  51. }
  52. param[i], param[minValueIdx] = param[minValueIdx], param[i]
  53. }
  54. }
  55. // 归并排序
  56. func Merge(param []int, l, r int) {
  57. if l >= r {
  58. return
  59. }
  60. m := (l + r) / 2
  61. Merge(param, l, m)
  62. Merge(param, m+1, r)
  63. merge(param, l, m, m+1, r)
  64. }
  65. // 合并
  66. func merge(param []int, l, m, m1, r int) {
  67. merged := make([]int, r-l+1)
  68. i, j, k := l, m1, 0
  69. for i <= m && j <= r {
  70. if param[i] < param[j] {
  71. merged[k] = param[i]
  72. k, i = k+1, i+1
  73. } else {
  74. merged[k] = param[j]
  75. k, j = k+1, j+1
  76. }
  77. }
  78. remainL, remainR := i, m
  79. if j <= r {
  80. remainL, remainR = j, r
  81. }
  82. copy(merged[k:], param[remainL:remainR+1])
  83. copy(param[l:r+1], merged)
  84. }
  85. // 快排
  86. func Quick(param []int, l, r int) {
  87. if l >= r {
  88. return
  89. }
  90. pivot := partition(param, l, r)
  91. Quick(param, l, pivot-1)
  92. Quick(param, pivot+1, r)
  93. }
  94. // 分区
  95. func partition(param []int, l, r int) int {
  96. i, j := l, l
  97. for j < r {
  98. if param[j] >= param[r] {
  99. j++
  100. } else {
  101. param[i], param[j] = param[j], param[i]
  102. i, j = i+1, j+1
  103. }
  104. }
  105. param[i], param[j] = param[j], param[i]
  106. return i
  107. }

查找

package find

func BinarySearchRecursive(param []int, l, r, target int) int {
    if l > r {
        return -1
    }

    var idx int
    m := (l + r) / 2
    if target < param[m] {
        idx = BinarySearchRecursive(param, l, m-1, target)
    } else if param[m] < target {
        idx = BinarySearchRecursive(param, m+1, r, target)
    } else {
        return m
    }
    return idx
}

func BinarySearchIterate(param []int, l, r, target int) int {
    for l <= r {
        m := (l + r) / 2
        if target < param[m] {
            r = m - 1
        } else if param[m] < target {
            l = m + 1
        } else {
            return m
        }
    }
    return -1
}