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

正如问题所述,我无法找到以下算法中的问题所在。它是归并排序的辅助函数,即用于组合排序数组的函数。


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


翻翻过去那场雪
浏览 223回答 3
3回答

慕田峪9158850

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

RISEBY

您不需要所有索引:切片已经是数组的视图。这是一个使用纯切片操作的完整示例:package mainimport "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 {&nbsp; &nbsp; res := make([]int, 0, len(a)+len(b))&nbsp; &nbsp; for len(a) > 0 || len(b) > 0 {&nbsp; &nbsp; &nbsp; &nbsp; if len(b) == 0 || len(a) > 0 && a[0] <= b[0] {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res = append(res, a[0])&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a = a[1:]&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res = append(res, b[0])&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b = b[1:]&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return res}func main() {&nbsp; &nbsp; a := []int{1, 2, 5, 6, 3, 4, 7, 9}&nbsp; &nbsp; fmt.Println(Merge(a[:4], a[4:]))}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go