归并排序
归并排序实际上是对分治法的一个利用,将一个大的数组分成小的处理,再合并,我在实现过程中,有两个点是比较容易出错的,希望大家看了以后等注意起来,不要出错
先看代码:
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语言中,这些错误都是致命的