归并排序将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
1.归并排序过程
- 时间复杂度:O(n log n)
- 空间复杂度:O(n)
- 归并排序是稳定的排序算法
2.Go语言实现
func MergeSort(arr []int,n int) {
tmp := make([]int,n)
msort(arr,tmp,0,n - 1)
}
func msort(arr []int,tmp []int,left int,right int) {
if left < right {
mid := (left + right) / 2
msort(arr,tmp,left,mid)
msort(arr,tmp,mid + 1,right)
merge(arr,tmp,left,mid,right)
}
}
func merge(arr []int,tmp []int,left int,mid int,right int) {
//标记左半区第一个未排序的元素
l := left
//标记右半区第一个未排序的元素
r := mi