我是 stackoverflow 的新手,我需要一些帮助来编写一个程序来对可比数组列表进行合并排序。我已经在这段代码上工作了几个小时,但没有成功。该程序需要正确运行,因为我正在为计算机科学课程做它,而下一个作业要求我们测试不同类型的效率。这是代码:
合并方法:
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]