List 合并排序不适用于升序

List 合并排序不适用于升序,list,algorithm,scala,math,functional-programming,List,Algorithm,Scala,Math,Functional Programming,我正在学习一门有关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 (mergedLi

我正在学习一门有关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)
这是因为:

case (l :: lTail, r :: rTail) if l > r => (l :: mergedList, lTail, rightRemaining)
如果大于
r
,则放置在第一个位置
l
。如果要按升序排列,则应将其反转:

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

解决方案非常简单。您只需将(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)