排序
package sort// 冒泡排序func Bubble(param []int) { limit := len(param) - 1 for i := 0; i < len(param); i++ { for j := 0; j < limit; j++ { if param[j] <= param[j+1] { continue } param[j], param[j+1] = param[j+1], param[j] } limit-- }}// 比较两个数组func CompareIntSlice(param1, param2 []int) bool { len1 := len(param1) len2 := len(param2) if len1 != len2 { return false } for i := range param1 { if param1[i] != param2[i] { return false } } return true}// 插入排序func Insertion(param []int) { for i := 1; i < len(param); i++ { curValue := param[i] for j := i - 1; j >= 0; j-- { if param[j] > curValue { param[j+1] = param[j] } else { param[j+1] = curValue break } } }}// 选择排序func Selection(param []int) { for i := 0; i < len(param)-1; i++ { minValueIdx := i for j := i + 1; j < len(param); j++ { if param[j] < param[minValueIdx] { minValueIdx = j } } param[i], param[minValueIdx] = param[minValueIdx], param[i] }}// 归并排序func Merge(param []int, l, r int) { if l >= r { return } m := (l + r) / 2 Merge(param, l, m) Merge(param, m+1, r) merge(param, l, m, m+1, r)}// 合并func merge(param []int, l, m, m1, r int) { merged := make([]int, r-l+1) i, j, k := l, m1, 0 for i <= m && j <= r { if param[i] < param[j] { merged[k] = param[i] k, i = k+1, i+1 } else { merged[k] = param[j] k, j = k+1, j+1 } } remainL, remainR := i, m if j <= r { remainL, remainR = j, r } copy(merged[k:], param[remainL:remainR+1]) copy(param[l:r+1], merged)}// 快排func Quick(param []int, l, r int) { if l >= r { return } pivot := partition(param, l, r) Quick(param, l, pivot-1) Quick(param, pivot+1, r)}// 分区func partition(param []int, l, r int) int { i, j := l, l for j < r { if param[j] >= param[r] { j++ } else { param[i], param[j] = param[j], param[i] i, j = i+1, j+1 } } param[i], param[j] = param[j], param[i] return i}
查找
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
}