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

Algorithm 以下合并排序算法有什么问题?,algorithm,go,mergesort,Algorithm,Go,Mergesort,正如问题所述,我很难在下面的算法中找到问题所在。它是mergesort的辅助函数,即用于组合已排序数组的函数 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; i

正如问题所述,我很难在下面的算法中找到问题所在。它是mergesort的辅助函数,即用于组合已排序数组的函数

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 6 55 70]

这个函数的JavaScript等价物可以正常工作,但我不知道为什么它不能在Go中工作

谢谢

像L:=arr[p:q]这样的代码不会创建副本。我想在分配给arr的任务期间,您正在覆盖L和R部分。请查看以了解切片是如何工作的。例如,你基本上不会写像toSort*[]int这样的东西,因为[]int几乎是一种指针

这似乎有效:

像L:=arr[p:q]这样的代码不会创建副本。我想在分配给arr的任务期间,您正在覆盖L和R部分。请查看以了解切片是如何工作的。例如,你基本上不会写像toSort*[]int这样的东西,因为[]int几乎是一种指针


这似乎有效:

通过引用传递Golang切片。因此,您首先不需要将指针传递到函数中,但是您需要获取L和R的显式副本,或者完全合并到不同的片中。您当前正在写入从中获取值的相同基础内存。

通过引用传递Golang切片。因此,您首先不需要将指针传递到函数中,但是您需要获取L和R的显式副本,或者完全合并到不同的片中。您当前正在写入从中获取值的相同基础内存。

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

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:]))
}

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

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:]))
}

我有两个答案要接受,这很难,但我选择接受埃文的答案,因为它快了1分钟。好的,你们也在操场上修改了我的程序,但他的代表分数要小得多。无论如何,谢谢你!我有两个答案要接受,这很难,但我选择接受埃文的答案,因为它快了1分钟。好的,你们也在操场上修改了我的程序,但他的代表分数要小得多。无论如何,谢谢你!非常感谢。我知道我在使用该语言时犯了一些错误,因为js vesion运行得很好。虽然,正如我所知,在js数组中,它也是通过引用传递的。但是我认为array.splice函数可以复制底层数组。谢谢。我知道我在使用该语言时犯了一些错误,因为js vesion运行得很好。虽然,正如我所知,在js数组中,它也是通过引用传递的。但我认为array.splice函数会复制底层数组。