归并排序
归并排序的思想核心
分组合并
分组合并
如此重复,直至得到一个有序序列。
递归版本代码实现
func MergeSort(arr []int) []int {
// 数组长度
length := len(arr)
// 数组为空或者数组只有一个元素
if length <= 1 {
return arr
}
// 中间点
mid := length / 2
// 递归
leftArr := MergeSort(arr[:mid])
rightArr := MergeSort(arr[mid:])
// 归并
return merge(leftArr, rightArr)
}
func merge(left []int, right []int) []int {
// 最终结果
var result []int
for len(left) != 0 && len(right) != 0 {
// 左边小于右边
if left[0] <= right[0] {
result = append(result, left[0])
left = left[1:]
// 左边大于右边
} else {
result = append(result, right[0])
right = right[1:]
}
}
// 把没有结束的归并过来
for len(left) != 0 {
result = append(result, left[0])
left = left[1:]
}
for len(right) != 0 {
result = append(result, right[0])
right = right[1:]
}
return result
}
迭代版本代码实现
时间复杂度
归并排序的时间复杂度为O(nlogn)。
稳定性
归并排序在合并的时候都需要进行两两比较,所以它是一种稳定排序算法。