我最近开始尝试使用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
答案 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
应用于left
和right
时,这些子阵列left
和{{1没有按right
排序。一个更简单的例子:
InversionCount