归并排序
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
用途
用途:速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。
复杂度
平均时间复杂度:O(nlogn)
空间复杂度:T(n)
思路
归并排序:
目标数组如果长度小于等于1则返回
将数组拆分为左边项和右边项
排序数组左边项(递归)
排序右边项(递归)
返回 左右项排序的结果
左右项排序:
开辟空间长度为左右项长度之和的结果数组
初始化左右项指针
循环 左右项指针达到结尾
- 依次比较左右项指针指向数值的大小,将比较结果追加到结果数组里
将剩余部分追加到结束数组
返回 结果数组
代码
//归并排序
func mergeSort(target []int) []int {
targetLen := len(target)
if targetLen <= 1 {
return target
}
mediaIndex := targetLen / 2
left := target[:mediaIndex]
right := target[mediaIndex:]
//排序左项
left = mergeSort(left)
//排序右项
right = mergeSort(right)
//返回左右项
return merge(left, right)
}
//左右项排序
func merge(left, right []int) (result []int) {
lLen := len(left)
rLen := len(right)
//开辟空间
result = make([]int, 0, lLen+rLen)
//初始化左右项指针
lp, rp := 0, 0
//左右项指针达到结尾
for lp < lLen && rp < rLen {
//依次比较左右项指针指向数值大小,追加到结果里
if left[lp] < right[rp] {
result = append(result, left[lp])
lp++
} else {
result = append(result, right[rp])
rp++
}
}
//将剩余项追加到结果中.索引指向切片的右边界时,slice[index:]返回空切片
result = append(result, left[lp:]...)
result = append(result, right[rp:]...)
return result
}
func main() {
ss:= []int{6,33,16,1,246,4,765,213,12,43,24,32,432,6,547,65,123,234,534,5}
fmt.Println(mergeSort(ss))
}