go 實現歸併排序

littlexiaoshuishui發表於2020-06-10

歸併排序:如果要排序一個陣列,我們先把陣列從中間分成前後兩部分, 然後對前後兩部分分別排序,再將排好序的兩部分合並在一起,這樣整個陣列就都有序了。
複雜度是 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 協議》,轉載必須註明作者和本文連結

相關文章