Проблема сортировки рекурсивного выбора - PullRequest
0 голосов
/ 06 августа 2011

Я делаю некоторые изменения для предстоящего повторения :( и у меня возникла проблема со следующей рекурсивной реализацией Выбор сортировки в Scala.

По большей части это работает, но, похоже, не происходит замена первых двух значений, когда они должны быть изменены. Я уверен, что это довольно просто, но мой колпачок для решения проблем на этом этапе немного заржавел

Любые идеи с благодарностью, вот код, который я до сих пор:

 object question3 {
  def main(args : Array[String]) : Unit =
  {
      var arr = Array(8,9,8,5,2,4,1,6,3,7,5,-1,5,0,99)
      arr = sort(arr, 0, 0, 0)

      println("RESULT:")
      arr.foreach(str=>print(str+","))
  }
  def sort(arr : Array[Int], n : Int, min : Int, j : Int): Array[Int] =
  {
      if(n == arr.length)
      {
          return arr
      }
      else
      {
          var j = n+1
          var min = n

          if(j < arr.length)
          {
              if(arr(j) < arr(min))
              {
                  min = j  
              }
              sort(arr, n+1, min, j+1)
          }
          if(min != n)
          {
            var t = arr(n)
            arr(n) = arr(min)
            arr(min) = t
          }
          sort(arr, n+1, min, j)
      }
  }
}

1 Ответ

2 голосов
/ 06 августа 2011

Во-первых, вы никогда не используете параметры min и j для чего-либо, вместо этого они затеняют их локальными определениями.

Во-вторых, вы не должны устанавливать переменную min до первого рекурсивного вызова. Когда ваш код стоит, он устанавливает min в соответствии с тем, какой из первых двух начальных элементов меньше, но никогда не учитывает вероятность того, что в массиве будет еще меньше.

Это дает что-то, что больше похоже на попытку сортировки пузырьков, чем сортировку выбора. Если вам нужна истинная сортировка выбора, вы, вероятно, хотите, чтобы отдельный цикл (или рекурсивная функция) сначала находил индекс минимального элемента.

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