Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我在为Java实现合并排序时遇到了一个问题_Java_Sorting_Merge - Fatal编程技术网

我在为Java实现合并排序时遇到了一个问题

我在为Java实现合并排序时遇到了一个问题,java,sorting,merge,Java,Sorting,Merge,这是我收到的错误消息。小心它们的数组索引,更改为main Before: 5 4 3 5 7 5 1 5 96 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 at Lab1_2.merge(Lab1_2.java:28) at Lab1_2.mergeSort(Lab1_2.java:61) at Lab1_2.mergeSort(Lab1_2.java:59

这是我收到的错误消息。

小心它们的数组索引,更改为main

    Before: 5 4 3 5 7 5 1 5 96 
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at Lab1_2.merge(Lab1_2.java:28)
    at Lab1_2.mergeSort(Lab1_2.java:61)
    at Lab1_2.mergeSort(Lab1_2.java:59)
    at Lab1_2.mergeSort(Lab1_2.java:59)
    at Lab1_2.mergeSort(Lab1_2.java:59)
    at Lab1_2.main(Lab1_2.java:8)

小心它们的数组索引,更改为main

    Before: 5 4 3 5 7 5 1 5 96 
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at Lab1_2.merge(Lab1_2.java:28)
    at Lab1_2.mergeSort(Lab1_2.java:61)
    at Lab1_2.mergeSort(Lab1_2.java:59)
    at Lab1_2.mergeSort(Lab1_2.java:59)
    at Lab1_2.mergeSort(Lab1_2.java:59)
    at Lab1_2.main(Lab1_2.java:8)

您正在获取ArrayIndexOutOfBoundsException运行时异常,因为您试图访问超出数组边界(限制)的数组。 在merge方法中,您的语句如下

   mergeSort(test,0, test.length-1); // change array init index 0
声明大小为n1的数组,可以从0到n-1的索引处获取元素。 但您正在尝试将元素存储在索引n1处。这是不可能的,因为我们知道数组的元素从0到大小-1(这里的大小是数组的长度),这是原因之一。你在其他地方也有问题。 所以我编辑了你的代码,希望下面的代码对你有用

 int[] L = new int[n1];
/*打包任何内容;//不要放置包名*/
导入java.util.*;
导入java.lang.*;
导入java.io.*;
表意文字
{
公共静态void main(字符串[]args)引发java.lang.Exception
{
//你的密码在这里
int[]检验={5,4,3,5,7,5,1,5,96};
系统输出打印(“之前:”);
打印列表(测试);
mergeSort(test,0,test.length-1);
系统输出打印(“后:”);
打印列表(测试);
}
公共静态无效打印列表(int[]测试){
对于(int i=0;in2){
A[k]=L[i];
i++;
}

else if(L[i]您正在获取ArrayIndexOutOfBoundsException运行时异常,因为您试图访问超出数组边界(限制)的数组。 在merge方法中,您的语句如下

   mergeSort(test,0, test.length-1); // change array init index 0
声明大小为n1的数组,可以从0到n-1的索引处获取元素。 但您正在尝试将元素存储在索引n1处。这是不可能的,因为我们知道数组中的元素从0到大小-1(这里的大小是数组的长度),这是原因之一。您在其他一些地方发出了问题。 所以我编辑了你的代码,希望下面的代码对你有用

 int[] L = new int[n1];
/*包无论什么;//不要放置包名*/
导入java.util.*;
导入java.lang.*;
导入java.io.*;
表意文字
{
公共静态void main(字符串[]args)引发java.lang.Exception
{
//你的密码在这里
int[]检验={5,4,3,5,7,5,1,5,96};
系统输出打印(“之前:”);
打印列表(测试);
mergeSort(test,0,test.length-1);
系统输出打印(“后:”);
打印列表(测试);
}
公共静态无效打印列表(int[]测试){
对于(int i=0;in2){
A[k]=L[i];
i++;
}

否则,如果(L[i]可以得到更好的可读性解决方案

/* package whatever; // don't place package name! */

import java.util.*;

import java.lang.*;

import java.io.*;


class Ideone
    {
    public static void main (String[] args) throws java.lang.Exception
    {
    // your code goes here
        int[] test = {5,4,3,5,7,5,1,5,96};
    System.out.print("Before: ");
    printList(test);
    mergeSort(test, 0, test.length-1);
    System.out.print("After:  ");
    printList(test);
}

public static void printList(int[] test){
for (int i= 0; i < test.length; i++){
    System.out.print(test[i] + " ");
}
System.out.println();
}

public static void merge(int[] A, int p, int q, int r){
int n1 = q - p + 1;
int n2 = r - q;

int[] L = new int[n1];
int[] R = new int[n2];

for(int i = 0; i < n1; i++){
    L[i] = A[p+i];
}
for (int j = 0; j < n2; j++){
    R[j] = A[q+j+1];
}
//int i = 0;
//int j = 0;

   /* for (int k=p; i <= r; i++){
    if (i > n1){
        A[k] = R[j];
        j++;
    }
    else if (j > n2){
        A[k] = L[i];
        i++;
    }
    else if (L[i] <= R[j]){
        A[k] = L[i];
        i++;
    }
    else{
        A[k] = R[j];
        j++;
    }
    }*/

       int i = 0, j = 0;


    int k = p;
    while (i < n1 && j < n2)
    {
        if (L[i] <= R[j])
        {
            A[k] = L[i];
            i++;
        }
        else
        {
            A[k] = R[j];
            j++;
        }
        k++;
    }


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


    while (j < n2)
    {
        A[k] = R[j];
        j++;
        k++;
    }

}

public static void mergeSort(int[] A, int p, int r){
if (p < r){
    int q = (p + r) / 2;
    mergeSort(A, p, q);
    mergeSort(A, q+1, r);
    merge(A, p, q, r);
}
}

}
公共类合并排序{
私有int[]数组;
私人内特[]坦普尔加尔;
私有整数长度;
公共静态void main(字符串a[]{
int[]inputArr={5,4,3,5,7,5,1,5,96};
系统输出打印(“之前:”);
打印列表(inputArr);
MergeSort mms=新的MergeSort();
mms.sort(输入端);
系统输出打印(“后:”);
打印列表(inputArr);
}
公共静态无效打印列表(int[]测试){
对于(int i=0;i对于(int i=lowerIndex;i而言,可以使用更好的可读性解决方案

/* package whatever; // don't place package name! */

import java.util.*;

import java.lang.*;

import java.io.*;


class Ideone
    {
    public static void main (String[] args) throws java.lang.Exception
    {
    // your code goes here
        int[] test = {5,4,3,5,7,5,1,5,96};
    System.out.print("Before: ");
    printList(test);
    mergeSort(test, 0, test.length-1);
    System.out.print("After:  ");
    printList(test);
}

public static void printList(int[] test){
for (int i= 0; i < test.length; i++){
    System.out.print(test[i] + " ");
}
System.out.println();
}

public static void merge(int[] A, int p, int q, int r){
int n1 = q - p + 1;
int n2 = r - q;

int[] L = new int[n1];
int[] R = new int[n2];

for(int i = 0; i < n1; i++){
    L[i] = A[p+i];
}
for (int j = 0; j < n2; j++){
    R[j] = A[q+j+1];
}
//int i = 0;
//int j = 0;

   /* for (int k=p; i <= r; i++){
    if (i > n1){
        A[k] = R[j];
        j++;
    }
    else if (j > n2){
        A[k] = L[i];
        i++;
    }
    else if (L[i] <= R[j]){
        A[k] = L[i];
        i++;
    }
    else{
        A[k] = R[j];
        j++;
    }
    }*/

       int i = 0, j = 0;


    int k = p;
    while (i < n1 && j < n2)
    {
        if (L[i] <= R[j])
        {
            A[k] = L[i];
            i++;
        }
        else
        {
            A[k] = R[j];
            j++;
        }
        k++;
    }


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


    while (j < n2)
    {
        A[k] = R[j];
        j++;
        k++;
    }

}

public static void mergeSort(int[] A, int p, int r){
if (p < r){
    int q = (p + r) / 2;
    mergeSort(A, p, q);
    mergeSort(A, q+1, r);
    merge(A, p, q, r);
}
}

}
公共类合并排序{
私有int[]数组;
私人内特[]坦普尔加尔;
私有整数长度;
公共静态void main(字符串a[]{
int[]inputArr={5,4,3,5,7,5,1,5,96};
系统输出打印(“之前:”);
打印列表(inputArr);
MergeSort mms=新的MergeSort();
mms.sort(输入端);
系统输出打印(“后:”);
打印列表(inputArr);
}
公共静态无效打印列表(int[]测试){
对于(int i=0;i