【发布时间】:2020-03-15 00:41:02
【问题描述】:
我有一个包含以下元素的数组:var arr = Array[Int](10,16,8,12,15,6,3,9,5) 我正在尝试使用快速排序技术对其进行排序。
以下是我编写的用于快速排序的代码:
object Quick {
def main(args: Array[String]): Unit = {
var arr = Array[Int](10,16,8,12,15,6,3,9,5)
var low = 0
var high = arr.length-1
quickSort(low, high)
arr.foreach(println)
def quickSort(low:Int, high:Int):Unit = {
if(low<high) {
var j = partition(low, high)
quickSort(low, j)
quickSort(j+1, high)
}
}
def partition(low:Int, high:Int): Int = {
var pivot = arr(low)
var i = low
var j = high
while(i<j) {
do {
i += 1
} while(arr(i) <= pivot)
do {
j -= 1
} while(arr(j) > pivot)
if(i<j) swap(i, j)
}
swap(i, j)
j
}
def swap(ai:Int, aj:Int): Unit = {
var tmp = arr(ai)
arr(ai) = arr(aj)
arr(aj) = tmp
}
}
}
当我运行代码时,它在以下行中断:while(arr(i) <= pivot) 索引变为9
我通过添加条件if(i < arr.length-1) i += 1 处理了第一个 do while
在第二个 do 中也会发生同样的情况,其中行中的索引:while(arr(j) > pivot) 变为 -1 并以 ArrayOutOfBoundsException 结尾。我通过添加条件来处理它:if(j>0) j-= 1
如果我添加这些条件但我删除了它们,代码将进入无限循环,它会导致 ArrayOutOfBoundsException 索引:9 & -1 分别表示低和高。
谁能告诉我我在这里做错了什么?
【问题讨论】:
-
while、do/while、var、返回Unit的函数(在大多数情况下)等都被认为是Scala中的代码异味......我不确定快速排序算法,但试图通过函数的约束来解决这个问题,函数总是返回一个有用的类型并且不改变任何变量。它还使调试更容易,因为您不必在任何给定时间跟踪变异变量的值。 -
这是真的,但实施高效的算法可能需要有效地访问和更改数据。使用纯函数方法可能会更困难
标签: arrays algorithm scala sorting quicksort