为了账号安全,请及时绑定邮箱和手机立即绑定

以下归并排序算法有什么问题?

以下归并排序算法有什么问题?

Go
翻翻过去那场雪 2021-07-28 15:44:12
正如问题所述,我无法找到以下算法中的问题所在。它是归并排序的辅助函数,即用于组合排序数组的函数。func Merge(toSort *[]int, p, q, r int) {    arr := *toSort    L := arr[p:q]    R := arr[q:r+1]    fmt.Println(L)    fmt.Println(R)    i := 0    j := 0    for index := p; index <= r; index++ {        if i >= len(L) {            arr[index] = R[j]            j += 1            continue        } else if j >= len(R) {            arr[index] = L[i]            i += 1            continue        }        if L[i] > R[j] {            fmt.Println("right smaller")            arr[index] = R[j]            j += 1            continue        }        if L[i] <= R[j] {            fmt.Println("left smaller")            arr[index] = L[i]            i += 1            continue        }    }}因为arr := []int{1,7,14,15,44,65,79,2,3,6,55,70}它作为输出给出[1 2 2 2 2 2 2 2 3 6 55 70]。此函数的 JavaScript 等效项按预期工作,但我不知道为什么它在 Go
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

Golang 切片是通过引用传递的。因此,您不需要首先将指针传递到函数中,但您确实需要将LandR或 else 的显式副本合并到一个不同的切片中。您当前正在写入您从中获取值的相同底层内存。


查看完整回答
反对 回复 2021-08-02
?
RISEBY

TA贡献1856条经验 获得超5个赞

您不需要所有索引:切片已经是数组的视图。这是一个使用纯切片操作的完整示例:


package main


import "fmt"


// Merge takes two sorted, increasing slices of ints and

// returns a slice combining them into a single sorted, increasing

// slice.

func Merge(a, b []int) []int {

    res := make([]int, 0, len(a)+len(b))

    for len(a) > 0 || len(b) > 0 {

        if len(b) == 0 || len(a) > 0 && a[0] <= b[0] {

            res = append(res, a[0])

            a = a[1:]

        } else {

            res = append(res, b[0])

            b = b[1:]

        }

    }

    return res

}


func main() {

    a := []int{1, 2, 5, 6, 3, 4, 7, 9}

    fmt.Println(Merge(a[:4], a[4:]))

}


查看完整回答
反对 回复 2021-08-02
  • 3 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信