我知道迭代merge sort可以在網(wǎng)上找到,但是我創(chuàng)建的這個實現(xiàn)似乎與我在網(wǎng)上看到的例子大不相同。這是我所擁有的。我迭代地實現(xiàn)了這個,但認為它不正確,因為這不是recursive實現(xiàn)所遵循的。遞歸實現(xiàn)splits/sorts一半然后另一個然后合并。此實現(xiàn)對整個列表進行拆分/排序,然后將它們與stack.我的問題是,這是一個正確的迭代實現(xiàn)嗎?我想我應該使用 aqueue而不是 a stack。public static List<Integer> iterativeMergeSort(List<Integer> nums){ Stack<List<Integer>> stack = new Stack<List<Integer>>(); for (int num : nums) { stack.push(new ArrayList<Integer>(Arrays.asList(num))); } while (stack.size() > 1) { List<Integer> a = stack.pop(); List<Integer> b = stack.pop(); stack.push(merge(a,b)); } return stack.pop();}public static List<Integer> merge(List<Integer> a, List<Integer> b) { int i = 0; int j = 0; List<Integer> merged = new ArrayList<Integer>(); while (i < a.size() && j < b.size()) { if (a.get(i) == b.get(j)) { merged.add(a.get(i)); merged.add(b.get(j)); i++; j++; } else if (a.get(i) < b.get(j)) { merged.add(a.get(i)); i++; } else { //a.get(i) > b.get(j) merged.add(b.get(j)); j++; } } while (i < a.size()) { merged.add(a.get(i)); i++; } while (j < b.size()) { merged.add(b.get(j)); j++; } return merged;}
2 回答

哈士奇WWW
TA貢獻1799條經驗 獲得超6個贊
迭代歸并排序通常是自下而上的。與使用重復遞歸拆分數(shù)組不同,自底向上歸并排序跳過該步驟并將 n 個元素的數(shù)組視為大小為 1 的 n 次運行,并立即開始合并運行。自頂向下歸并排序只會拆分子運行,直到在執(zhí)行任何合并之前產生兩個大小為 1 的子運行為止,并且速度稍慢,這就是為什么大多數(shù)庫使用自下而上歸并排序的一些變體的原因。Wiki 文章包含用于自底向上歸并排序的偽代碼:
https://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation
可以通過交換指針或引用而不是復制來避免復制回步驟。

揚帆大魚
TA貢獻1799條經驗 獲得超9個贊
這個實現(xiàn)對我來說是錯誤的。這更像是一個插入排序(https://en.wikipedia.org/wiki/Insertion_sort)。合并排序的想法是將數(shù)據(jù)分成 2 個接近偶數(shù)的組,但此實現(xiàn)并沒有這樣做。您的 'a' 基本上是先前排序的元素的列表,而 'b' 是要添加的下一個元素。
添加回答
舉報
0/150
提交
取消