Как применить логику слияния в сортировке слиянием после разделения коллекции? - PullRequest
1 голос
/ 01 декабря 2019

Я пытаюсь отсортировать массив, используя технику сортировки слиянием, и ниже приведен код, который я написал для этого:

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) Я не мог отследить, почему вывод не сортируется? Может ли кто-нибудь сообщить мне, если я пропустил дело?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...