正如问题所述,我无法在以下算法中找到问题所在。它是mergesort的aux函数,即用于组合排序数组的函数。
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
中不起作用
谢谢
答案 0 :(得分:2)
Golang切片通过引用传递。所以你不需要首先将指针传递给函数,但你做需要获取L
和R
的显式副本,否则合并成一个完全不同的切片。您目前正在写入获得价值的相同底层内存。
答案 1 :(得分:1)
L := arr[p:q]
之类的代码不创建副本。我想你在arr
的作业期间覆盖你的L和R部分。查看http://blog.golang.org/slices以了解切片的工作原理。 (例如,你基本上永远不会写toSort *[]int
这样的东西,因为[]int
几乎是一种指针)
答案 2 :(得分:1)
您不需要所有索引:切片已经是数组的视图。这是一个使用纯切片操作的完整示例:
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:]))
}