我需要帮助来填补一些空白,以便分区在调用分区(data,lower,upper)时工作。不过,我认为if语句应该是if(lower<upper-1),以避免浪费调用。另外,sortrange必须对范围[下限,上限]进行快速排序。我的问题是,在def sort[a](data:array[a])(…):unit={}的(…)中必须做些什么才能使它正常工作,如何实现swap以使它在具有一系列int的数组[a]上进行交换?
object Quicksort {
def partition[A](data: Array[A], lower: Int, upper: Int)
(implicit comp: Ordering[A]): Int = {
val pivot = data(upper-1)
var mid = lower-1
for (i <- lower until upper-1) {
if (comp.lteq(data(i),pivot)) {
mid += 1
swap(data,mid,i)
}
}
swap(data,mid+1,upper-1)
mid+1
}
def sort[A](data: Array[A])(...): Unit = {
def sortRange(data: Array[A], lower: Int, upper: Int):
Unit = {
if(lower < upper) {
val pivotIndex = partition(data,lower,upper)
sortRange(data,lower,pivotIndex)
sortRange(data,pivotIndex+1,upper)
}
}
sortRange(data,0,data.length)
}
def main(args: Array[String]) : Unit = {
//Result of partition(data,lower,upper):
//sortRange results in quick-sorting the range: [lower,upper)
}
}
1条答案
按热度按时间pkwftd7m1#
由于快速排序是一种就地排序算法(也就是说,它完全是关于副作用的),所以我不想传递要排序的集合,而是希望将该方法“附加”到所述集合。
我还想去掉那些讨厌的可变变量。
测试: