go 实现归并排序

归并排序:如果要排序一个数组,我们先把数组从中间分成前后两部分, 然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。
复杂度是 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 协议》,转载必须注明作者和本文链接
走出舒适区
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!