Java递归合并排序
目前我对我的递归合并排序程序印象深刻,我一直在寻找问题所在,但似乎找不到它Java递归合并排序,java,recursion,mergesort,Java,Recursion,Mergesort,目前我对我的递归合并排序程序印象深刻,我一直在寻找问题所在,但似乎找不到它 package mergesort; import java.util.ArrayList; public class MergeSort { public MergeSort() { // TODO Auto-generated constructor stub } public static <T extends Comparable<? super T>> void merg
package mergesort;
import java.util.ArrayList;
public class MergeSort {
public MergeSort() {
// TODO Auto-generated constructor stub
}
public static <T extends Comparable<? super T>> void mergesort(T[] list, int n)
{
mergeSort(list,0,n-1);
}
static <T extends Comparable<? super T>>
void mergeSort(T[] tempArray, int firstHalfSorted, int secondHalfSorted){
T[] temp = (T[]) new Comparable <?>[tempArray.length];
mergeSort(tempArray, temp, firstHalfSorted, secondHalfSorted);
}
private static <T extends Comparable<? super T>>
void mergeSort (T[ ] tempArray, T[] a, int firstHalfSorted, int secondHalfSorted){
if (firstHalfSorted < secondHalfSorted)
{
int mid = (firstHalfSorted + secondHalfSorted) / 2;
mergeSort(tempArray,a,firstHalfSorted, mid);
mergeSort(tempArray,a,mid+1, secondHalfSorted);
if(tempArray[mid].compareTo(tempArray[mid+1])>0)
merge(tempArray,a,firstHalfSorted, mid, secondHalfSorted);
}
}
private static <T extends Comparable<? super T>>
void merge(T[] a, T[] tempArray, int firstHalfSorted, int mid, int secondHalfSorted)
{
int bhalf1 = firstHalfSorted;
int ehalf1 = mid;
int bhalf2 = mid + 1;
int ehalf2 = secondHalfSorted;
int j = 0;
for(;(bhalf1 <= ehalf1) && (bhalf2 <= ehalf2); j++)
{
if (a[bhalf1].compareTo(a[bhalf2]) < 0)
{
tempArray[j] = a[bhalf1];
bhalf1++;
}
else
{
tempArray[j] = a[bhalf2];
bhalf2++;
}
for(;bhalf1 <= ehalf1; bhalf2++, j++)
tempArray[j] = a[bhalf1];
for(;bhalf2 <= ehalf2; bhalf2++, j++)
tempArray[j] = a[bhalf2];
for(j = firstHalfSorted; j <= secondHalfSorted; j++)
a[j] = tempArray[j];
}
}
}
包合并排序;
导入java.util.ArrayList;
公共类合并排序{
公共排序(){
//TODO自动生成的构造函数存根
}
公共静态[tempArray.length];
合并排序(tempArray、temp、firsthalfsorded、secondhalfsorded);
}
私有静态您的merge
方法有很多问题
把每个for
循环都放在那里,写一行注释来描述它应该做什么李>
不要声明一个变量(如j
),然后将其重新用于多个循环。将循环变量限制在循环范围内,例如(int j=.;.;)
李>
merge
方法编写几个测试用例,并将该方法与所有递归分开进行测试你的输出是什么?你应该为每一次迭代做一个打印,这将帮助你了解到底发生了什么on@Ajoy线程“main”中的“异常”java.lang.ArrayIndexOutOfBoundsException:9在mergesort.mergesort.mergesort.merge(mergesort.java:59)在mergesort.mergesort.mergesort.mergesort(mergesort.java:32)在mergesort.mergesort.mergesort(mergesort.java:29)在mergesort.mergesort.mergesort(mergesort.java:29)在mergesort.mergesort.mergesort.mergesort(mergesort.java:29)在mergesort.mergesort.mergesort.mergesort(mergesort.java:19)在mergesort.Driver.main(Driver.java:15)”
package mergesort;
import java.util.ArrayList;
import java.util.Arrays;
public class Driver <T extends Comparable<? super T>>{
public Driver() {
// TODO Auto-generated constructor stub
}
public static <T> void main(String[] args) {
String array[] = new String[] {"Zeke,"Bob","Ali","John","Jody","Jamie","Bill","Rob", "Zeke", "Clayton"};
MergeSort sortList = null;
sortList.mergeSort(array,0,10);
for(int a=0;a<array.length;a++)
System.out.println(array[a]);
}
}