0

私はScalaの学習を始めたばかりで、横にいくつかのアルゴリズムも行っています。以下はScalaでのマージソートの実装です。私はそれが本質的にあまり「スカラ」ではないことを知っており、スカラで Java を書こうとしたと考える人さえいるかもしれません。私はscalaに完全に精通しているわけではありません。基本的な構文をいくつか知っているだけで、さらに何かが必要な場合はグーグルを続けています。したがって、このコードをより機能的にし、scala の規則とベスト プラクティスに準拠させるために、このコードで何ができるかについてのヒントを教えてください。正しい/最適化されたコードを提供しないでください。自分でやりたいと思います。どんな提案でも大歓迎です!

def mergeSort(list: Array[Int]): Array[Int] = {
    val len = list.length
    if (len == 1) list
    else {
      var x, y = new Array[Int](len / 2)
      val z = new Array[Int](len)
      Array.copy(list, 0, x, 0, len / 2)
      Array.copy(list, len / 2, y, 0, len / 2)
      x = mergeSort(x)
      y = mergeSort(y)
      var i, j = 0
      for (k <- 0 until len) {
        if (j >= y.length || (i < x.length && x(i) < y(j))) {
          z(k) = x(i)
          i = i + 1
        } else {
          z(k) = y(j)
          j = j + 1
        }
      }
      z
    }
  }

[編集] このコードは正常に動作し、今のところ、入力配列は常に偶数の長さであると想定しています。

更新 変数 x と y を削除しました

def mergeSort(list: Array[Int]): Array[Int] = {
    val len = list.length
    if (len == 1) list
    else {
      val z = new Array[Int](len)
      val x = mergeSort(list.dropRight(len/2))
      val y = mergeSort(list.drop(len/2))
      var i, j = 0
      for (k <- 0 until len) {
        if (j >= y.length || (i < x.length && x(i) < y(j))) {
          z(k) = x(i)
          i = i + 1
        } else {
          z(k) = y(j)
          j = j + 1
        }
      }
      z
    }
  }
4

1 に答える 1

0

を削除するvar x,y = ...と、機能するための良いスタートになります。変更可能なデータセットよりも不変性を優先します。

ヒント: 2 つの値を取り、それらを述語を使用して並べ替えて返すメソッド swap

forループ (または内包表記) を削除することも検討してください。

于 2013-07-08T12:42:12.023 に答える