Java 合并排序提供IndexOutOfBoundsException
代码从一个文件中读取大量案例和数组大小,然后填充一个数组并将其发送以进行合并排序。Java 合并排序提供IndexOutOfBoundsException,java,Java,代码从一个文件中读取大量案例和数组大小,然后填充一个数组并将其发送以进行合并排序。 问题是我总是把索引弄得越界,这简直要了我的命 我的调试器刚刚停止在eclipse上工作 import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class mergesort { public static void mergeSort(int[] array, int fi
问题是我总是把
索引弄得越界
,这简直要了我的命
我的调试器刚刚停止在eclipse上工作
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class mergesort {
public static void mergeSort(int[] array, int first, int last){
int mid;
if (first<last){
mid = (last + first)/2;
mergeSort(array, first, mid);
mergeSort(array, mid+1, last);
merge(array, first, last);
}
}
public static void merge(int[] array, int first, int last){
int mid = (last-first)/2;
int[] temp = new int[(last-first)];
int a1 = first, a2 = mid + 1, current = 0;
while (a1 <=mid && a2<=last){
if (array[a1] <= array[a2])
temp[current++] = array[a1++];
else
temp[current++] = array[a2++];
}
for (int i = a1; i<=mid; i++)
temp[current++] = array[i];
for (int i = a2; i<=last; i++)
temp[current++] = array[i];
for (int i =0; i<temp.length; i++)
array[first+i] = temp[i];
}
public static void main(String[] args) throws FileNotFoundException {
File file = new File("sort.in");
Scanner scan = new Scanner(file);
int n1 = scan.nextInt();
for (int i = 0; i<n1; i++){
int[] array =new int[scan.nextInt()];
for (int j = 0; j<array.length; j++){
array[j] = scan.nextInt();
}
mergeSort(array, 0, (array.length)-1);
for (int j = 0; j<array.length; j++){
System.out.println(array[j]);
}
}
}
}
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.util.Scanner;
公共类合并排序{
公共静态void mergeSort(int[]数组,int first,int last){
int mid;
如果(首先)对于初学者,您的temp
数组太短了一个元素:
int[] temp = new int[(last-first)];
由于last
和first
都包含在内,因此上述内容应为:
int[] temp = new int[last - first + 1];
程序的merge
部分有几个bug(不包括NPE显示的bug),首先:
应该是:
int mid = (last+first)/2;
第二,末端的3个for循环将运行,但您应该只在a1/a2的其余部分上运行
我的实现有点不同-也许这有助于解释第二个bug:
public static void mergeSort(int[] arr, int start, int end){
if(start == end) return;
// now the recursive calls:
// divide the arr:
int middle = (end+start)/2;
mergeSort(arr, start, middle);
mergeSort(arr, middle+1, end);
// now merge (conquer)
merge(arr, start, end, middle);
}
private static void merge(int[] arr, int start, int end, int middle) {
int[] sorted = new int[end-start+1];
for(int i=start,j=middle+1,index=0; index < sorted.length;){
if(j<=end && arr[i] > arr[j]){
sorted[index] = arr[j];
j++; index++;
}
else if (i<=middle){
sorted[index] = arr[i];
i++; index++;
}
else{
sorted[index] = arr[j];
j++; index++;
}
}
// now copy "sorted" to original array
for(int i=start,j=0; i<=end; i++,j++){
arr[i] = sorted[j];
}
}
public static void main(String...args){
int[] arr = {4,2,9,6,2,8,1,9,10,15,12,11};
mergeSort(arr, 0, arr.length - 1);
for(int i=0; i<arr.length; i++){
System.out.print(arr[i]+" ");
}
}
公共静态无效合并排序(int[]arr,int start,int end){
如果(开始==结束)返回;
//现在递归调用:
//划分arr:
中间整数=(结束+开始)/2;
合并排序(arr、start、middle);
合并排序(arr,中间+1,结束);
//现在合并(征服)
合并(arr、开始、结束、中间);
}
私有静态无效合并(int[]arr,int start,int end,int middle){
int[]排序=新int[结束-开始+1];
对于(inti=start,j=middle+1,index=0;index 否则,如果(我“并且调试器没有在我的eclipse上工作…”那么第1步是修复您的eclipse安装。第2步是向我们展示stacktrace,以及您从哪里获得AIOOBok抱歉没有提前回复…谢谢npe我想我应该更有条理
public static void mergeSort(int[] arr, int start, int end){
if(start == end) return;
// now the recursive calls:
// divide the arr:
int middle = (end+start)/2;
mergeSort(arr, start, middle);
mergeSort(arr, middle+1, end);
// now merge (conquer)
merge(arr, start, end, middle);
}
private static void merge(int[] arr, int start, int end, int middle) {
int[] sorted = new int[end-start+1];
for(int i=start,j=middle+1,index=0; index < sorted.length;){
if(j<=end && arr[i] > arr[j]){
sorted[index] = arr[j];
j++; index++;
}
else if (i<=middle){
sorted[index] = arr[i];
i++; index++;
}
else{
sorted[index] = arr[j];
j++; index++;
}
}
// now copy "sorted" to original array
for(int i=start,j=0; i<=end; i++,j++){
arr[i] = sorted[j];
}
}
public static void main(String...args){
int[] arr = {4,2,9,6,2,8,1,9,10,15,12,11};
mergeSort(arr, 0, arr.length - 1);
for(int i=0; i<arr.length; i++){
System.out.print(arr[i]+" ");
}
}