归并排序
- 核心算法为:已知两个有序的序列,将其调成一个有序的序列(O(n))
- 通过分治,将序列划分成两个小序列,一次划分下去,将小序列调成有序,然后调用上述算法调成一个有序的序列。
func Merge(arr1,arr2 []int) []int {
res := make([]int,len(arr1)+len(arr2))
i,j,k:= 0,0,0
for i<len(arr1)&&j<len(arr2) {
if arr1[i] <= arr2[j] {
res[k] = arr1[i]
i++;k++
} else {
res[k] = arr2[j]
j++;k++
}
}
for i<len(arr1) {
res[k] = arr1[i]
i++;k++
}
for j<len(arr2){
res[k] = arr2[j]
j++;k++
}
return res
}
func MSort1(arr []int) {
if len(arr)>1 {
MSort1(arr[:len(arr)/2])
MSort1(arr[len(arr)/2:])
res := Merge(arr[:len(arr)/2],arr[len(arr)/2:])
copy(arr,res)
}
}
- 非递归(循环)实现归并排序
- 先间隔2将对应每一段调成有序,然后间隔4合并之前有序的各段,一次循环,将整个序列调成有序
func MSort2(arr []int) {
for tmp := 1;tmp<len(arr);tmp++{
i:=0
for ;i<=len(arr)-2*tmp;i+=2*tmp{
cop := Merge(arr[i:tmp+i],arr[tmp+i:i+tmp*2])
copy(arr[i:i+tmp*2],cop)
}
if i+tmp<len(arr) {
cop := Merge(arr[i:tmp+i],arr[tmp+i:])
copy(arr[i:],cop)
}
}
}