Я пытаюсь отсортировать массив, используя технику сортировки слиянием, и ниже приведен код, который я написал для этого:
object MergeSort {
def main(args: Array[String]): Unit = {
val arr = Array[Int](2,4,1,6,8,5,3,7)
val b = mergeSort(arr)
b.foreach(println)
}
def mergeSort(arr:Array[Int]):Array[Int] = {
if(arr.length<2) arr
else {
val mid = (arr.length)/2
val (left,right) = arr.splitAt(mid)
println("Left: " + left.mkString(", "))
println("right: "+ right.mkString(", "))
mergeSort(left)
mergeSort(right)
merge(left, right, arr)
}
}
def merge(left: Array[Int], right: Array[Int], arr: Array[Int]):Array[Int] = {
var brr = new Array[Int](arr.length)
val nl = left.length
val nr = right.length
var (i:Int,j:Int,k:Int) = (0,0,0)
while(i < nl && j < nr) {
if(left(i) < right(j)) {
brr(k) = left(i)
i += 1
}
else {
brr(k) = right(j)
j += 1
}
k+=1
}
while(i < nl) {
brr(k) = left(i)
i += 1
k += 1
}
while(j < nr) {
brr(k) = right(j)
j += 1
k += 1
}
brr
}
}
Я напечатал операторы, в которых основной массив разделен на несколько меньших. Вывод println("Left: " + left.mkString(", ")
& println("right: "+ right.mkString(", "))
Left: 2, 4, 1, 6
right: 8, 5, 3, 7
Left: 2, 4
right: 1, 6
Left: 2
right: 4
Left: 1
right: 6
Left: 8, 5
right: 3, 7
Left: 8
right: 5
Left: 3
right: 7
Механизм разбиения работает должным образом, но окончательный вывод не сортируется, поскольку он печатает элементы в том же порядке входного массива: arr = Array[Int](2,4,1,6,8,5,3,7)
Кодсначала дал ArrayOutOfBoundException
в строке brr(k) = left(i)
, поэтому я инициализировал длину brr
как var brr = new Array[Int](arr.length)
Я не мог отследить, почему вывод не сортируется? Может ли кто-нибудь сообщить мне, если я пропустил дело?