排序算法III
归并排序
func MergeSortV(nums []int) []int{
// 归并排序
// 递归终止条件
n := len(nums)
if n < 2 {
return nums
}
// 分治
k := n / 2
// 单层算法
merge := func(left, right []int) []int{
// 额外空间
m, n2 := len(left), len(right)
tmp := make([]int, 0)
var i, j int
for i < m && j < n2 {
if left[i] < right[j]{
tmp = append(tmp, left[i])
i++
}else {
tmp = append(tmp, right[j])
j++
}
}
tmp = append(tmp, left[i:]...)
tmp = append(tmp, right[j:]...)
return tmp
}
left := MergeSortV(nums[:k])
right := MergeSortV(nums[k:])
return merge(left, right)
}
- 是否为稳定排序算法
归并排序采用的是分治思路,将数组分成两个部分,无法保证相同元素前后相对位置,因为相同元素可能被分到不同的部分,故为非稳定排序算法 - 时间复杂度
最好时间复杂度和最坏时间复杂度均为O(nlogn) - 空间复杂度
有额外的数组空间消耗,故为O(n)