2013-02-27 94 views
4

代码从一个文件中读取一些情况和数组的大小,然后填充数组并将其发送到合并排序。
问题是我总是收到index out of bounds,它正在杀死我......合并排序给出IndexOutOfBoundsException

我的调试器刚刚停止在我的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]); 
      } 
     } 
    } 
} 
+8

*“和调试器不上我的日食工作......” *所以第一步是修复您的Eclipse安装。 – 2013-02-27 17:48:06

+3

第二步是向我们展示堆栈跟踪,以及您在哪里得到的AIOOB – pcalcao 2013-02-27 17:49:32

回答

1

对于初学者来说,你temp阵列是一个元素太短:

int[] temp = new int[(last-first)]; 

由于两个lastfirst是包容性的,上面应改为:

int[] temp = new int[last - first + 1]; 
+0

确定对不起,以前没有回复...谢谢倪我想我应该更有组织 – 2013-03-02 01:39:34

1

merge部分你的程序有几个错误(不包括NPE显示的错误),第一个:

int mid = (last-first)/2; 

应该是:

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