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]);
    }
    }