合并排序的关键在于它的合并算法,对原数组进行的拆分很好理解,
mergesort() 取中值将数组分成两部分,分别送入递归的拆分函数mergesort()
当左端不小于右端索引时结束拆分,开始合并
合并算法 传入原数组 a[] 和一个辅助数组merge[],和左右端索引 left 和 right,找到中值索引中值mid,用 i 和 j 分别遍历 left -->mid 和 mid+1-->right,每次都将 a[i] 和 a[j] 中大的一方存入 merge[k] 中,直到左右两部分中有一方遍历完毕,就将另一部分的剩余数组元素依次存入 merge数组的对应位置。最后将 merge 数组的值赋值给 a 数组
主函数输入举例如下
6
1 2 2 2 3 5
package Divide
func Merge(a []int64, merge []int64, left int, right int) {
mid := (left + right) / 2
i := left
j := mid + 1
k := left
for ; i <= mid && j <= right; k++ {
if a[i] >= a[j] {
merge[k] = a[j]
j++
} else {
merge[k] = a[i]
i++
}
}
for ; i <= mid; i++ {
merge[k] = a[i]
k++
}
for ; j < right; j++ {
merge[k] = a[j]
k++
}
for i = left; i <= right; i++ {
a[i] = merge[i]
}
}
func MergeSort(a []int64, merge []int64, left int, right int) {
if left < right {
mid := (left + right) / 2
MergeSort(a[:], merge[:], left, mid)
MergeSort(a[:], merge[:], mid+1, right)
Merge(a[:], merge[:], left, right)
}
}