使用 mergesort gets stackoverflow 对数组进行排序
Sort an array of pairs using mergesort gets stackoverflow
我在 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 分量使用归并排序对它进行排序。
到目前为止我有这个
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)
}
但是,它给了我一个 Whosebug 错误。我不知道是什么原因造成的。有更好的方法吗?
编辑:@ggorlen 指出我遗漏了基本情况,经过检查,我在修改合并排序函数时不小心删除了基本情况。谢谢!
您的递归过程缺少基本情况,否则您的过程将陷入循环,无限期地调用自身并最终导致堆栈溢出。
在编写递归过程时,必须了解有两种情况必须明确定义。
1。 Recursive case : 当递归过程调用自身时(Recursion)
2。基本情况:当递归触底时(在您的情况下,当数组包含单个项目时会发生这种情况,在这种情况下它已经排序,无需递归)
基本情况对于递归过程非常重要属性,因为它负责阻止过程陷入无休止的递归。
我在 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 分量使用归并排序对它进行排序。
到目前为止我有这个
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)
}
但是,它给了我一个 Whosebug 错误。我不知道是什么原因造成的。有更好的方法吗?
编辑:@ggorlen 指出我遗漏了基本情况,经过检查,我在修改合并排序函数时不小心删除了基本情况。谢谢!
您的递归过程缺少基本情况,否则您的过程将陷入循环,无限期地调用自身并最终导致堆栈溢出。
在编写递归过程时,必须了解有两种情况必须明确定义。
1。 Recursive case : 当递归过程调用自身时(Recursion)
2。基本情况:当递归触底时(在您的情况下,当数组包含单个项目时会发生这种情况,在这种情况下它已经排序,无需递归)
基本情况对于递归过程非常重要属性,因为它负责阻止过程陷入无休止的递归。