需要在Scala中优化Merge Sort实现的指针

时间:2013-07-08 09:43:55

标签: scala optimization mergesort

我刚开始学习Scala和侧身我也在做一些算法。下面是Scala中合并排序的实现。我知道它本质上不是非常“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
    }
  }

1 个答案:

答案 0 :(得分:0)

删除var x,y = ...将是一个良好的开端。更喜欢不可变数据集的不变性。

提示:一个方法交换,它接受两个值并使用谓词返回它们

还要考虑删除for循环(或理解)。