我正在嘗試對 size 的字符串列表實現合并排序算法N,并且我已設法對其進行排序,但由于某種原因,原始值被添加到排序列表的末尾。我對實現排序算法還很陌生(閱讀:非常新),所以如果有人讓我知道我是否錯過了什么,我真的很感激。 public static void mergeSortWords(int n, List<String> words) { if (n < 2) { return; } int mid = n / 2; // Getting the mid-point of the array List<String> l = new ArrayList<String>(mid); // Left side of array List<String> r = new ArrayList<String>(n-mid); // Right side of array for (int i = 0; i < mid; i++) { l.add(i, words.get(i)); } for (int j = mid; j < n; j++) { r.add(j - mid, words.get(j)); } mergeSortWords(mid, l); // recursively sort the left side mergeSortWords(n-mid, r); // recursively sort the right side mergeWords(n, words, l, r, mid, n-mid); // merge the sorted arrays back together } public static void mergeWords(int n, List<String> words, List<String> l, List<String> r, int left, int right) { if (words.size() > n) { return; } int i = 0, j = 0, k = 0; while (i < left && j < right) { if (l.get(i).compareToIgnoreCase(r.get(j)) < 0) { // comparing the strings alphabetically words.add(k++, l.get(i++)); } else { words.add(k++, r.get(j++)); } } while (i < left) { words.add(k++, l.get(i++)); } while (j < right) { words.add(k++, r.get(j++)); } }我像這樣進行單元測試: @Test public void mergeSortWordsTest() { List<String> actual = new ArrayList<String>(); List<String> expected = new ArrayList<String>(); actual.add("hello"); actual.add("yo"); actual.add("hi"); actual.add("what"); actual.add("bottle");
1 回答

慕森卡
TA貢獻1806條經驗 獲得超8個贊
因為words
您傳遞給的列表mergeWords
永遠不會被清除。mergeWords
只會將新元素添加到此列表中,而不關心它已經包含的元素。只需做一個
words.clear();
在。。。之初mergeWords
。
.set(int index, E element)
或者,您可以使用而不是覆蓋現有元素.add()
。但您需要確保列表的大小正確。
一些不相關的評論:
在函數調用中,您始終將列表的大小作為附加參數傳遞(n
, left
, right
)。這是多余的(您可以使用 獲取尺寸list.size()
)。任何多余的東西都很容易變得不一致(即,如果傳遞錯誤的大小會發生什么?)。所以最好刪除這些參數。
當您將元素添加到列表時,您可以使用重載add(int index, E element)
。這完全沒問題,但我認為使用重載add(E element)
更容易處理,因為您不需要跟蹤在哪里添加元素。重載只會將新元素附加到列表的末尾。
添加回答
舉報
0/150
提交
取消