排序
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
}