2016-07-12 46 views
1

我正在從Java遷移到Scala,我正在嘗試爲mergesort算法提供合併過程。我的解決辦法:在scala中mergesort的合併

def merge(src: Array[Int], dst: Array[Int], from: Int, 
      mid: Int, until: Int): Unit = { 

     /* 
     * Iteration of merge: 
     * i - index of src[from, mid) 
     * j - index of src[mid, until) 
     * k - index of dst[from, until) 
     */ 
     @tailrec 
     def loop(i: Int, j: Int, k: Int): Unit = { 
      if (k >= until) { 
       // end of recursive calls 
      } else if (i >= mid) { 
       dst(k) = src(j) 
       loop(i, j + 1, k + 1) 
      } else if (j >= until) { 
       dst(k) = src(j) 
       loop(i + 1, j, k + 1) 
      } else if (src(i) <= src(j)) { 
       dst(k) = src(i); 
       loop(i + 1, j, k + 1) 
      } else { 
       dst(k) = src(j) 
       loop(i, j + 1, k + 1) 
      } 
     } 
     loop(from, mid, from) 
    } 

似乎工作,但在我看來,這是寫在相當「勢在必行」的風格 (儘管我已經使用遞歸,也沒有可變的變量除了陣列,用於其副作用打算)。我想是這樣的:

/* 
* this code is not working and at all does the wrong things 
*/ 
for (i <- (from until mid); j <- (mid until until); 
    k <- (from until until) if <???>) yield dst(k) = src(<???>) 

但我想出了這樣那樣的妥善解決CANT。你能幫我麼?

+0

也許你的問題屬於上http://codereview.stackexchange.com/ .. – meucaa

+1

@meucaa潛在的,但目前還沒有寫入。代碼評審問題的形式是「這是X的代碼,它怎麼能做得更好」而不是「這是X的代碼,我怎麼才能讓它做Y代替」。如果OP放棄了他們問題的第二部分,那麼它將非常適合CR。 – Kaz

+0

@扎克實際上我問的是如何做得更好,我不希望代碼做任何事情而不是合併。 –

回答

2

考慮一下:

val left = src.slice(from, mid).buffered 
    val right = src.slice(mid, until).buffered 

    (from until until) foreach { k => 
    dst(k) = if(!left.hasNext) right.next 
     else if(!right.hasNext || left.head < right.head) left.next 
     else right.next 
    } 
+0

謝謝,這絕對是比我更優雅的解決方案。可能我必須更多地閱讀scala中的迭代器。 –