나는 아주 새로운 stackoverflow이고 나는 comparables의 arraylist를 mergesort하는 프로그램을 작성하는 데 도움이 필요합니다. 나는이 코드를 몇 시간 동안 사용해 보았지만 아무 소용이 없었다. 내가 컴퓨터 과학 수업을하고 있기 때문에 프로그램이 올바르게 작동해야하고, 다음 과제는 다른 종류의 효율성을 테스트 할 것을 요구합니다.자바에서 병합 정렬에 문제가
병합 방법 :
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
두 개의 분리 된 ArrayList를 실제로 병합하는 대신에, 나는 중간을 분리 자의 일종으로 설정합니다. 내 병합 방법의 아이디어는 b의 첫 번째 요소 또는 b의 두 번째 절반의 첫 번째 요소를 a의 첫 번째 인덱스에 쓰고 b가 비어있을 때까지 반복하는 것입니다. – user3325257