Go语言&算法 合并排序算法

文章详细介绍了合并排序的过程,首先通过mergesort()函数对数组进行拆分,然后使用合并算法,通过比较原数组a[]的两个子部分a[i]和a[j],将较大元素存入辅助数组merge[],最后将排序后的merge[]赋值回a[]。整个过程涉及递归和中值索引计算。
摘要由CSDN通过智能技术生成

 合并排序的关键在于它的合并算法,对原数组进行的拆分很好理解,

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)
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值