【问题标题】:Merge sort not working for ascending order合并排序不适用于升序
【发布时间】:2019-09-12 20:39:51
【问题描述】:

我正在学习一门关于 scala 的课程,其中我正在执行合并排序操作。这是为此编写的代码

def merge(leftList:List[Int], rightList:List[Int]): List[Int] = {

  val output = (0 until leftList.length + rightList.length).foldLeft(List[Int](), leftList, rightList) { (triple, _) =>
    val (mergedList, leftRemaining, rightRemaining) = triple
    (leftRemaining, rightRemaining) match {
      case (Nil, r :: rTail) => (r :: mergedList, Nil, rTail)
      case (l :: lTail, Nil) => (l :: mergedList, lTail, Nil)
      case (l :: lTail, r :: rTail) if l > r => (l :: mergedList, lTail, rightRemaining)
      case (l :: lTail, r :: rTail) => (r :: mergedList, leftRemaining, rTail)
    }
  }
  output._1.reverse
}

def mergeSort(inputList: IndexedSeq[Int]): List[Int] = {
  if(inputList.length == 1) List(inputList.head)
  else {
    val (leftList, rightList) = inputList.splitAt(inputList.length / 2)
    val sortedLeft = mergeSort(leftList)
    val sortedRight = mergeSort(rightList)
    merge(sortedLeft, sortedRight)
  }
}

mergeSort(Vector(3,4,1,2,33))

但是,列表不是按升序排序,而是始终按降序排序。我尝试调试代码,但没有得出任何结论。任何帮助将不胜感激。 我目前的输出如下

res0: List[Int] = List(33, 4, 3, 2, 1)

预期输出是

List(1, 2, 3, 4, 33)

【问题讨论】:

  • 将 .reverse 改为 sorted

标签: list algorithm scala math functional-programming


【解决方案1】:

因为这里:

case (l :: lTail, r :: rTail) if l > r => (l :: mergedList, lTail, rightRemaining)

如果l 大于r,则您将放在第一位。如果要升序,则应将其反转:

case (l :: lTail, r :: rTail) if l <= r => (l :: mergedList, lTail, rightRemaining)

【讨论】:

    【解决方案2】:

    解决方案非常简单。您只需将 (l > r) 更改为 (l

    请参考以下代码

    def merge(leftList:List[Int], rightList:List[Int]): List[Int] = {
    
      val output = (0 until leftList.length + rightList.length).foldLeft(List[Int](), leftList, rightList) { (triple, _) =>
        val (mergedList, leftRemaining, rightRemaining) = triple
        (leftRemaining, rightRemaining) match {
          case (Nil, r :: rTail) => (r :: mergedList, Nil, rTail)
          case (l :: lTail, Nil) => (l :: mergedList, lTail, Nil)
          case (l :: lTail, r :: rTail) if l < r => (l :: mergedList, lTail, rightRemaining)
          case (l :: lTail, r :: rTail) => (r :: mergedList, leftRemaining, rTail)
        }
      }
      output._1.reverse
    }
    
    def mergeSort(inputList: IndexedSeq[Int]): List[Int] = {
      if(inputList.length == 1) List(inputList.head)
      else {
        val (leftList, rightList) = inputList.splitAt(inputList.length / 2)
        val sortedLeft = mergeSort(leftList)
        val sortedRight = mergeSort(rightList)
        merge(sortedLeft, sortedRight)
      }
    }
    

    这会产生所需格式的输出

    res0: List[Int] = List(1, 2, 3, 4, 33)
    

    如果这回答了您的问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 2018-11-20
      • 2021-07-01
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 2015-06-28
      • 1970-01-01
      • 2016-08-11
      相关资源
      最近更新 更多