我是全新的stackoverflow,我需要一些幫助,編寫一個程序mergesort可比數列表。我已經在這段代碼上工作了幾個小時,但無濟於事。該程序需要正確工作,因爲我正在爲計算機科學課程做這個工作,而下一個任務需要我們測試不同類型的效率。下面的代碼:在java中合併排序的問題
合併方法:
public static void merge(ArrayList <Comparable> a, int first, int mid, int last){
ArrayList <Comparable> b = new ArrayList();
for(int k = first; k <= last; k++){
b.add(a.get(k));
}
System.out.println("b now contains " + b);
int middle =b.size() /2;
for(int i = first; i <= last; i++){
//System.out.println("mid: " + b.size() /2);
//System.out.println("b: " + b);
//System.out.println("a: " + a);
//System.out.println("i: " + i);
if(middle == b.size()){
a.set(i, b.remove(0));
middle--;
}else if(middle == 0){
a.set(0, b.remove(0));
}else if(b.get(0).compareTo(b.get(middle)) < 0){
System.out.println("moving " + b.get(0) + " from b[0] to a[" +
i + "] because " + b.get(0) + " is less than " + b.get(middle));
a.set(i, b.remove(0));
middle--;
System.out.println("b now contains " + b);
}else{
System.out.println("moving " + b.get(middle) + " from b[" +
b.size() /2 + "] to a[" + i + "] because " + b.get(0) +
" is greater than " + b.get(middle));
a.set(i, b.remove(middle));
//middle--;
System.out.println("b now contains " + b);
}
}
System.out.println();
System.out.println("Merge");
System.out.println(a);
System.out.println();
}
歸併方法:
public static void mergeSort(ArrayList <Comparable> a, int first, int last){
if(first < last){
int mid = first + (last - first) /2;
System.out.println("mergeSorting " + a.subList(first, last + 1));
mergeSort(a, first, mid);
System.out.println("mergeSorting " + a.subList(first, mid + 1));
mergeSort(a, mid + 1, last);
System.out.println("merging " + a.subList(first, mid + 1) +
" and " + a.subList(mid + 1, last + 1));
merge(a, first, mid, last);
}
System.out.println();
System.out.println("base case");
System.out.println();
}
我認爲有與merge
方法的問題,但我不知道。
我的代碼似乎是不正確的排序名單,即:
Input:
[7,1,9,9,5,4,8,9,10,4]
Output:
[4,8,9,4,10,10,5,9,9,7]
你能舉出一些你得到的具體錯誤的例子嗎? – mdewitt
合併方法似乎沒有任何意義。你從哪裏得到這個想法?你能用文字描述你想要在合併功能中做什麼嗎?根據代碼,我懷疑你的想法不對。 – Patrick87
而不是實際合併兩個獨立ArrayLists,我設置中間作爲一種分隔符。我的合併方法的想法是將b中的第一個元素或b的後半部分的第一個元素寫入a的第一個索引,並重復,直到b爲空。 – user3325257