一、归并排序介绍
- 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修 补"在一起,即分而治之)。
- 基本思想
- 将序列中待排序数字分为若干组,每个数字分为一组
- 将若干个组两两合并,保证合并后的组时有序的
- 重复第二步操作直到只剩下一组,排序完成
二、代码示例
package main
import (
"fmt"
)
// mergerSort
func mergerSort(arr []int, a, b int) {
if b-a <= 1 {
return
}
c := (a + b) / 2
mergerSort(arr, a, c)
mergerSort(arr, c, b)
arrLeft := make([]int, c-a)
arrRight := make([]int, b-c)
copy(arrLeft, arr[a:c])
copy(arrRight, arr[c:b])
i := 0
j := 0
for k := a; k < b; k++ {
if i >= c-a {
arr[k] = arrRight[j]
j++
} else if j >= b-c {
arr[k] = arrLeft[i]
i++
} else if arrLeft[i] < arrRight[j] {
arr[k] = arrLeft[i]
i++
} else {
arr[k] = arrRight[j]
j++
}
}
}
func main() {
// 测试代码
arr := []int{9, 8, 7, 6, 5, 1, 2, 3, 4, 0}
fmt.Println(arr)
mergerSort(arr, 0, len(arr))
fmt.Println(arr)
}