归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治策略.
分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
归并排序是用分治思想,分治模式在每一层递归上有三个步骤:
实现上有点类似二叉树的一个后序遍历, 先左右, 最后再根(合并)
package main
import "fmt"
func main() {
arr := []int{0, 8, 0, 10, 5, 4, 2, 0, 1, 7}
ret := MergeSort(arr)
fmt.Println(ret)
}
// 归并排序
func MergeSort(nums []int) []int {
arrLen := len(nums)
if arrLen < 2 {
return nums
}
i := arrLen >> 1
// 利用定义,排序左半部分
left := MergeSort(nums[0:i])
// 利用定义,排序右半部分
right := MergeSort(nums[i:])
/****** 后序位置 ******/
// 此时两部分子数组已经被排好序
// 合并两个有序数组
return merge(left, right)
}
func merge(left []int, right []int) []int {
m := len(left)
n := len(right)
result := make([]int, m+n, m+n)
i, j, k := 0, 0, 0
for i < m && j < n {
if left[i] >= right[j] {
result[k] = left[i]
i++
} else {
result[k] = right[j]
j++
}
k++
}
// 左边先完成, 右边还有剩余未合并的数据
if i == m {
for j < n {
result[k] = right[j]
k++
j++
}
}
// 右边边先完成, 左边还有剩余未合并的数据
if j == n {
for i < m {
result[k] = left[i]
k++
i++
}
}
return result
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。