我是全新的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