简单合并排序Java

简单合并排序Java,java,eclipse,mergesort,Java,Eclipse,Mergesort,我明天要交一个班级实验课,我完全被难倒了。要求很简单:制作一个mergeSort算法,使用可比较项对给定的ArrayList进行排序。“a”将有最终的排序列表。它目前正在抛出以下命令: Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 at java.util.ArrayList.rangeCheck(ArrayList.java:653) at java.util.ArrayLis

我明天要交一个班级实验课,我完全被难倒了。要求很简单:制作一个mergeSort算法,使用可比较项对给定的ArrayList进行排序。“a”将有最终的排序列表。它目前正在抛出以下命令:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at Sorts.merge(Sorts.java:142)
at Sorts.mergesort(Sorts.java:161)
at Sorts.mergesort(Sorts.java:160)
at Sorts.mergesort(Sorts.java:159)
at SortStep.sortMenu(SortStep.java:65)
at SortStep.main(SortStep.java:168)
什么都行!谢谢(我知道电话号码帮不了你们。对不起!)

/**
*接受整个向量,但将合并以下部分:
*[first]…a[mid]的左子列表,[mid+1]…a[last]的右子列表。
*前提条件:每个子列表已按升序排列
*
*@param a
*对要排序的整数数组的引用
*@param-first
*要排序的值范围的起始索引
*@param-mid
*待排序值范围的中点索引
*@param last
*要排序的值范围的最后一个索引
*/
私有无效合并(ArrayList a,int-first,int-mid,int-last){
ArrayList temp=新的ArrayList();
而(首先
  • 方法
    merge
    期望参数为
    first,mid,last
    ,但传递的是
    first,last,mid
  • mid
    正在前进,因此额外的元素可能存储在
    temp
  • merge
    的最后一个循环是错误的,它应该从调用方法时的
    第一个
    中开始,而不是
    0
  • 每个部分的范围都是错误的
更正代码:

private void merge(ArrayList<Comparable> a, int first, int mid, int last) {
    ArrayList<Comparable> temp = new ArrayList<Comparable>();
    mid++;

    int firstFirst = first;
    int firstEnd = mid;
    while (first < firstEnd && mid <= last) {
        if (a.get(first).compareTo(a.get(mid)) > 0) {
            temp.add(a.get(first));
            first++;
        } else {
            temp.add(a.get(mid));
            mid++;
        }
    }

    while (first < firstEnd) {
        temp.add(a.get(first));
        first++;
    }

    while (mid <= last) {
        temp.add(a.get(mid));
        mid++;
    }

    for (int i = firstFirst; i <= last; i++)
        a.set(i, temp.get(i - firstFirst));
}

public void mergesort(ArrayList<Comparable> a, int first, int last) {
    if (first < last) {
        int mid = (first + last) / 2;
        mergesort(a, first, mid);
        mergesort(a, mid + 1, last);
        merge(a, first, mid, last);
    }
}
private void merge(数组列表a,int first,int mid,int last){
ArrayList temp=新的ArrayList();
mid++;
int firstFirst=first;
int firstEnd=mid;
while(firstwhile(mid)你读到错误了吗?你正在访问数组列表中不存在的元素,这意味着你的索引数学在某个地方出错了。这里有一个输入错误
merge(a,first,last,mid);
应该是
merge(a,first,mid,last);
private void merge(ArrayList<Comparable> a, int first, int mid, int last) {
    ArrayList<Comparable> temp = new ArrayList<Comparable>();
    mid++;

    int firstFirst = first;
    int firstEnd = mid;
    while (first < firstEnd && mid <= last) {
        if (a.get(first).compareTo(a.get(mid)) > 0) {
            temp.add(a.get(first));
            first++;
        } else {
            temp.add(a.get(mid));
            mid++;
        }
    }

    while (first < firstEnd) {
        temp.add(a.get(first));
        first++;
    }

    while (mid <= last) {
        temp.add(a.get(mid));
        mid++;
    }

    for (int i = firstFirst; i <= last; i++)
        a.set(i, temp.get(i - firstFirst));
}

public void mergesort(ArrayList<Comparable> a, int first, int last) {
    if (first < last) {
        int mid = (first + last) / 2;
        mergesort(a, first, mid);
        mergesort(a, mid + 1, last);
        merge(a, first, mid, last);
    }
}