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

时间:2014-03-28 00:49:10

标签: algorithm go mergesort

正如问题所述,我无法在以下算法中找到问题所在。它是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]

Golang Play link

此函数的JavaScript等效函数按预期工作,但我不知道为什么它在Go中不起作用

谢谢

3 个答案:

答案 0 :(得分:2)

Golang切片通过引用传递。所以你不需要首先将指针传递给函数,但你需要获取LR的显式副本,否则合并成一个完全不同的切片。您目前正在写入获得价值的相同底层内存。

答案 1 :(得分:1)

L := arr[p:q]之类的代码创建副本。我想你在arr的作业期间覆盖你的L和R部分。查看http://blog.golang.org/slices以了解切片的工作原理。 (例如,你基本上永远不会写toSort *[]int这样的东西,因为[]int几乎是一种指针)

这似乎有效:http://play.golang.org/p/vPo2ZKXtI9

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