【问题标题】:Sort an array of pairs using mergesort gets stackoverflow使用mergesort对数组进行排序得到stackoverflow
【发布时间】: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


【解决方案1】:

您的递归过程缺少基本情况,否则您的过程将陷入循环,无限期地调用自身并最终导致堆栈溢出。

在编写递归过程时,必须明白有两种情况必须明确定义。

1.递归情况:递归过程调用自身时(递归)

2。基本情况:当递归触底时(在您的情况下,当数组包含单个项目时会发生这种情况,在这种情况下它已经排序,不需要递归)

基本情况是递归过程的非常重要的属性,因为它负责阻止过程陷入无限递归。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2012-11-14
    • 2014-12-11
    相关资源
    最近更新 更多