Golang:Counting Inversions排序问题

时间:2014-08-15 04:06:55

标签: recursion go

我最近开始尝试使用Golang。我正在尝试编写一个程序来计算给定切片的反转次数,但我遇到了一个问题。

我正在尝试使用基于MergeSort的代码对切片进行排序,但我的代码似乎没有正确地对切片进行排序。我假设必须对最终切片进行排序以使反转计数正常工作,但我不知道如何做到这一点。我可以在这个问题上得到一些帮助吗?

func InversionCount(a []int) int {
    if len(a) <= 1 {
        return 0
    }
    mid := len(a) / 2
    left := a[:mid]
    right := a[mid:]
    leftCount := InversionCount(left)
    rightCount := InversionCount(right)

    res := make([]int, 0, len(right)+len(left)) //temp slice to hold the sorted left side and right side

    iCount := mergeCount(left, right, &res)

    a = res        //Copies the result back into the original slice
    fmt.Println(a) //Why hasn't "a" been sorted?
    return iCount + leftCount + rightCount
}

func mergeCount(left, right []int, res *[]int) int {
    count := 0

    for len(left) > 0 || len(right) > 0 {
        if len(left) == 0 {
            *res = append(*res, right...)
            break
        }
        if len(right) == 0 {
            *res = append(*res, left...)
            break
        }
        if left[0] <= right[0] {
            *res = append(*res, left[0])
            left = left[1:]
        } else { //Inversion has been found
            count += 1
            *res = append(*res, right[0])
            right = right[1:]
        }
    }

    return count
}

func main() {
    s := []int{4, 3, 2, 1}
    fmt.Print(InversionCount(s))
}

以下是我的代码的链接:http://play.golang.org/p/QSJyg_qadD

1 个答案:

答案 0 :(得分:3)

您需要替换

count += 1

count += len(left)

关键是,在mergeCount left[0] > right[0]的任何一点,由于left已经排序,全部 left中的其他内容}相对于right[0]反转。如果这样做,您将获得正确的计数。

您的排序不起作用的事实是另一个问题。如果你有兴趣修复它,我建议取出所有计数逻辑,然后尝试修复排序。如果你仍然陷入困境,它可能值得拥有自己的问题。

一个问题是InversionCount(arr)不会导致arr被排序,所以

a = res        //Copies the result back into the original slice
fmt.Println(a) //Why hasn't "a" been sorted?

这不是您想要的,因为之前您将mergeCount应用于leftright时,这些子阵列left和{{1没有按right排序。一个更简单的例子:

InversionCount