【发布时间】:2021-08-29 09:50:09
【问题描述】:
我在 Kotlin 中有数组 A = arrayOf(Pair(1,1),Pair(0,9),Pair(3,8),Pair(4,0),Pair(6,6),Pair(10,7),Pair(5,1),Pair(7,3)),我想使用基于对的 X 分量的 mergesort 对其进行排序。
到目前为止我有这个
fun merge(U: Array<Pair<Int,Int>>, V: Array<Pair<Int,Int>>, A: Array<Pair<Int,Int>>) {
var i: Int = 0
var j: Int = 0
var size = U.size + V.size
for (k in 0 until size) {
if ((i < U.size)&&(j < V.size)) {
if (U[i].component1() < V[i].component1()) {
A[k] = U[i]
i = i + 1
}
else {
A[k] = V[j]
j = j + 1
}
}
}
}
fun mergeSort(A: Array<Pair<Int,Int>>) {
var middle = A.size / 2
var U = A.copyOfRange(0, middle)
var V = A.copyOfRange(middle, A.size)
mergeSort(U)
mergeSort(V)
merge(U, V, A)
}
但是,它给了我一个 stackoverflow 错误。我不知道这可能是什么原因。有没有更好的方法来做到这一点?
编辑:@ggorlen 指出我错过了基本情况,在检查后,我在修改合并排序函数时不小心删除了。谢谢!
【问题讨论】:
-
您可能想编写一个基本案例来停止递归。如果子列表大小为 1,则停止尝试拆分,直接返回即可;它已经排序了。顺便说一句,传递索引比复制列表更快。
-
@ggorlen 天哪,我没有注意到基本情况丢失,感谢您指出。我会做你告诉我的第二件事,谢谢!
标签: arrays sorting kotlin stack-overflow mergesort