基础排序算法-归并排序(Go语言)

  • 归并排序的思想其实就是对一个区间进行递归的分隔和合并,直到不可再分隔(即区间里只有一个元素):
  • 先递归分割为左右两个区间,然后对这两个区间进行合并

分隔:
在这里插入图片描述
合并(箭头向上是合并过程①~③):
在这里插入图片描述
其实最关键就是合并的过程
例如将 【2,3,6,8】和【1,4,5,7】两部分合并,过程如下:
在这里插入图片描述

归并排序代码(Go语言):

package main

import "fmt"

func mergeSort(arr *[]int, l int, r int) {
	if l >= r {//不可再分隔,只有一个元素
		return
	}
	mid := (l+r)/2
	mergeSort(arr,l,mid)
	mergeSort(arr,mid+1,r)
	if (*arr)[mid] > (*arr)[mid+1] {
		merge(arr, l, mid, r)
	}
}

//将arr[l...mid]和arr[mid+1...r]两部分进行归并
func merge(arr *[]int, l int, mid int, r int)  {
	//先把arr中[l..r]区间的值copy一份到arr2
	//注意:****这里可优化,copyarr可改为长度为r-l+1的数组,下面的赋值等操作按偏移量l来修改即可****,
	copyarr := make([]int, r+1)
	for index := l; index <= r; index++ {
		copyarr[index] = (*arr)[index]
	}
	//定义要合并的两个子数组各自目前数组内还没被合并的首位数字下标为i,j
	//初始化i,j
	i := l
	j := mid+1
	//遍历并逐个确定数组[l,r]区间内数字的顺序
	for k := l; k <= r; k++ {
		//防止i/j"越界",应该先判断i和j的下变是否符合条件(因为两个子数组应该符合i<=mid j<=r)
		if i > mid {
			(*arr)[k] = copyarr[j]
			j++
		}else if j > r {
			(*arr)[k] = copyarr[i]
			i++
		}else if copyarr[i] < copyarr[j] {
			(*arr)[k] = copyarr[i]
			i++
		}else{
			(*arr)[k] = copyarr[j]
			j++
		}
	}
}

func main() {
	arr := []int{8,6,2,3,1,5,7,4}
	mergeSort(&arr, 0, len(arr)-1)
	fmt.Println(arr)
}

输出:

[1 2 3 4 5 6 7 8]

时间复杂度O(NlogN) 空间复杂度O(N)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值