归并排序

归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

用途

用途:速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

复杂度

平均时间复杂度:O(nlogn)
空间复杂度:T(n)

思路

归并排序:
目标数组如果长度小于等于1则返回
将数组拆分为左边项和右边项
排序数组左边项(递归)
排序右边项(递归)
返回 左右项排序的结果

左右项排序:
开辟空间长度为左右项长度之和的结果数组
初始化左右项指针
循环 左右项指针达到结尾

  • 依次比较左右项指针指向数值的大小,将比较结果追加到结果数组里

将剩余部分追加到结束数组
返回 结果数组

代码
//归并排序
func mergeSort(target []int) []int {
	targetLen := len(target)
	if targetLen <= 1 {
		return target
	}
	mediaIndex := targetLen / 2
	left := target[:mediaIndex]
	right := target[mediaIndex:]

	//排序左项
	left = mergeSort(left)
	//排序右项
	right = mergeSort(right)
	//返回左右项
	return merge(left, right)
}

//左右项排序
func merge(left, right []int) (result []int) {
	lLen := len(left)
	rLen := len(right)
	//开辟空间
	result = make([]int, 0, lLen+rLen)
	//初始化左右项指针
	lp, rp := 0, 0
	//左右项指针达到结尾
	for lp < lLen && rp < rLen {
		//依次比较左右项指针指向数值大小,追加到结果里
		if left[lp] < right[rp] {
			result = append(result, left[lp])
			lp++
		} else {
			result = append(result, right[rp])
			rp++
		}
	}
	//将剩余项追加到结果中.索引指向切片的右边界时,slice[index:]返回空切片
	result = append(result, left[lp:]...)
	result = append(result, right[rp:]...)

	return result
}

func main() {
	ss:= []int{6,33,16,1,246,4,765,213,12,43,24,32,432,6,547,65,123,234,534,5}

	fmt.Println(mergeSort(ss))
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值