如何在合并排序代码上修复“ NegativeArraySizeException”?

时间:2019-01-21 16:39:20

标签: java

如果要排序的数组是10个及以上的元素,则会得到NegativeArraySizeException。它说的是这行代码“ int R [] = new int [n2];” , 我怎样才能解决这个问题?

如果您想知道为什么我的合并排序没有其他方法,我的教授专门要求在主要方法中进行合并排序。这种合并排序是迭代版本,因为我无法将递归版本仅压缩为main方法。

   public static void main(String[] args) 
{ 
    int arr[] = {100,99,98,97,96,95,94,93,92,93}; 

    int n = arr.length; 

    int curr_size;  
    int left_start; 

    for (curr_size = 1; curr_size <= n-1;  
                  curr_size = 2*curr_size) 
    { 
        for (left_start = 0; left_start < n-1; 
                    left_start += 2*curr_size) 
        { 

            int mid = left_start + curr_size - 1; 

            int right_end = Math.min(left_start  
                         + 2*curr_size - 1, n-1);


            int i, j, k; 
            int n1 = mid - left_start + 1; 
            int n2 = right_end - mid; 

            /* create temp arrays */
            int L[] = new int[n1]; 
            int R[] = new int[n2]; 

            /* Copy data to temp arrays L[] 
            and R[] */
            for (i = 0; i < n1; i++){ 
                L[i] = arr[left_start + i];
            }
            for (j = 0; j < n2; j++){
                R[j] = arr[mid + 1+ j]; 
            }

            i = 0; 
            j = 0; 
            k = left_start; 
            while (i < n1 && j < n2) 
                { 
                    if (L[i] <= R[j]) 
                    { 
                    arr[k] = L[i]; 
                    i++; 
                } 
                    else
                { 
                arr[k] = R[j]; 
                    j++; 
                } 
                k++; 
            } 


            while (i < n1){
                arr[k] = L[i]; 
                i++; 
                k++; 
            } 

            while (j < n2) { 
                arr[k] = R[j]; 
                j++; 
                k++;
            }
        }
    }
    System.out.printf("\nSorted array is \n"); 
    int i= 0;
    for (i=0; i < n; i++){ 
        System.out.print(arr[i]+ " "); 

    }

} 

}

1 个答案:

答案 0 :(得分:2)

我想我已经解决了。当然适用于给定的数组。 试试

  int mid = Math.min(left_start + curr_size - 1, n-1);

代替

 int mid = left_start + curr_size - 1;