简单合并排序Java
我明天要交一个班级实验课,我完全被难倒了。要求很简单:制作一个mergeSort算法,使用可比较项对给定的ArrayList进行排序。“a”将有最终的排序列表。它目前正在抛出以下命令:简单合并排序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
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(first while(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);
}
}