我在为Java实现合并排序时遇到了一个问题
这是我收到的错误消息。小心它们的数组索引,更改为main我在为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
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