go语言实现--归并排序

归并排序

归并排序实际上是对分治法的一个利用,将一个大的数组分成小的处理,再合并,我在实现过程中,有两个点是比较容易出错的,希望大家看了以后等注意起来,不要出错

先看代码:

func MergeSort(arr []int ,first,end int){
         if first<end{
         	mid:=(end+first)/2                  //将数组划分为左右两个,直到first==end
         	MergeSort(arr,first,mid)
         	MergeSort(arr,mid+1,end)
         	Merge(arr,first,mid,end)
		 }
}
func Merge(arr []int ,first,mid,end int){             //合并原理是利用两个数组
       n1:=mid-first+1         //第一个数组的长度
       n2:=end-mid           //第二个数组的长度
       l1:=[]int{}
       l2:=[]int{}

       for i:=0;i<n1;i++{
       	l1=append(l1,arr[first+i])                        //将了l1中放入元素
	   }
	   for j:=0;j<n2;j++{
	   	   l2=append(l2,arr[mid+1+j])          //l2中放入元素
	   }

	i,j,k:=0,0,first                                  //初始化下标,i指向l1,j指向l2,k指向arr,注意k==first!!不是0
	for i<n1 && j<n2 && k<=end{                 //控制下标,不要越界,
		if l1[i]<=l2[j]{
			arr[k]=l1[i]
			i++
		}else{
			arr[k]=l2[j]
			j++
		}
		k++
	}
	if i<n1{                               //如果l1中还有,全部按顺序放入arr中
		for j:=i;j<n1;j++{
			arr[k]=l1[j]
			k++
		}
	}
	if j<n2{                     //检查l2
		for i:=j;i<n2;i++{ 
			arr[k]=l2[i]
			k++
		}
	}
}

这里需要注意的是,每次传进的arr都是一个完整地数组,但是并不是会全部排序,所以基本上数组的长度不会使用,只是利用传进去的first,end,第一个下标是first!!!不是0哦~
其次每次合并需要利用两个数组,先通过参数,确定大小,再赋值,注意在go语言中,如果想要直接赋值,就要先用make分配好一个长度的空间,否则就用append,要不然会出错,一定要细心一点,否则在go语言中,这些错误都是致命的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值