归并排序
时间复杂度:
O(nlogn)
原理(降序):
采用的是分治法。
首先是分,将一个序列分成多个单值的有序序列。
然后是合,将这些有序序列按照规则合并,最终合成一个有序序列。
步骤:
1、将一个序列递归分成多个有序单值序列。
2、合并这些有序序列。
https://github.com/czasg/strualgo/blob/main/algo/sort/merge.go
package sort
import "github.com/czasg/strualgo/basis"
func MergeSortASC[Number basis.Number](nums []Number) []Number {
if len(nums) < 2 {
return nums
}
mid := len(nums) / 2
left := MergeSortASC(nums[:mid])
right := MergeSortASC(nums[mid:])
newNums := make([]Number, len(left)+len(right))
l, r := 0, 0
for i := 0; i < len(left)+len(right); i++ {
if l < len(left) && r < len(right) {
if left[l] < right[r] {
newNums[i] = left[l]
l++
} else {
newNums[i] = right[r]
r++
}
} else if l < len(left) {
newNums[i] = left[l]
l++
} else {
newNums[i] = right[r]
r++
}
}
return newNums
}