歸併排序:如果要排序一個陣列,我們先把陣列從中間分成前後兩部分, 然後對前後兩部分分別排序,再將排好序的兩部分合並在一起,這樣整個陣列就都有序了。
複雜度是 O(nlogn),非原地排序,比較耗空間。
func main() {
s := []int{6,7,8,10,4,6,99}
res := mergeSort(s)
fmt.Println(res)
}
func mergeSort(s []int) []int{
len := len(s)
if len == 1 {
return s //最後切割只剩下一個元素
}
m := len/2
leftS := mergeSort(s[:m])
rightS := mergeSort(s[m:])
return merge(leftS, rightS)
}
func merge(l []int, r []int) []int{
lLen := len(l)
rLen := len(r)
res := make([]int, 0)
lIndex,rIndex := 0,0 //兩個切片的下標,插入一個資料,下標加一
for lIndex<lLen && rIndex<rLen {
if l[lIndex] > r[rIndex] {
res = append(res, r[rIndex])
rIndex++
}else{
res = append(res, l[lIndex])
lIndex++
}
}
if lIndex < lLen { //左邊的還有剩餘元素
res = append(res, l[lIndex:]...)
}
if rIndex < rLen {
res = append(res, r[rIndex:]...)
}
return res
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結