数组索引越界异常合并排序过程Java
Array Index Out of Bounds Exception Merge Sort Procedure Java
我正在执行这个合并排序程序,但它抛出了越界异常,我不明白为什么会这样,我检查了所有数组参数是否满足,但它仍然有问题。
public class MergeSort
{
public static void main(String[] args) throws ArrayIndexOutOfBoundsException
{
int a[]={2,4,5,7,1,2,3,6};
System.out.println("Unsorted Array");
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+" ");
}
try{
MergeSort m=new MergeSort();
a=m.merge(a, 0, 3, 7);
}
catch(Exception e )
{
e.printStackTrace();
}
System.out.println("\nSorted Array");
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+" ");
}
}
int [] merge(int a[],int p,int q,int r)
{
//int a[]={2,4,5,7,1,2,3,6};
int n1=r-p+1;
int n2=r-q;
int L[]=new int[n1+1];
int R[]=new int[n2+1];
for(int i=0;i<n1;i++)
{
L[i]=a[i];
}
q=q+1;
for(int i=0;i<n2-1;i++)
{
R[i]=a[q+i];
}
//L[n1+1]=9;
///R[n2+1]=9;
int i=0,j=0;
for(int k=0;k<r;k++)
{
if(L[i]<=R[j])
{
a[k]=L[i];
i++;
}
else
{
a[k]=R[j];
j++;
}
}
return a;
}
}
Unsorted Array
2 4 5 7 1 2 3 6 java.lang.ArrayIndexOutOfBoundsException: 5
at scom.id.MergeSort.merge(MergeSort.java:63)
at scom.id.MergeSort.main(MergeSort.java:20)
Sorted Array
1 2 2 3 0 0 3 6
第51行需要
for(int k=0;k<r-1;k++)
这让它对我有用
我做了一些改动,将左右两个数组合并到一个已排序的数组中 element.Here 是 运行 正确的解决方案。
希望这能帮助您了解问题所在。
public class MergeSort {
public static void main(String[] args) throws ArrayIndexOutOfBoundsException {
int a[] = {2, 4, 5, 7, 1, 2, 3, 6};
System.out.println("Unsorted Array");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
MergeSort m = new MergeSort();
a = m.merge(a, 0, 3, 7);
System.out.println("\nSorted Array");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
int[] merge(int a[], int p, int q, int r) {
//int a[]={2,4,5,7,1,2,3,6};
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[i];
}
for (int i = 0; i < n2; i++) {
R[i] = a[q + i + 1];
}
//L[n1+1]=9;
///R[n2+1]=9;
int i = 0, j = 0 , k = 0;
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++;
}
return a;
}
}
首先错误的是分配给左右数组以临时保存的数组大小。
我对您的代码进行了一些修改以使其工作。给你:
public class MergeSort {
public static void main(String[] args) throws ArrayIndexOutOfBoundsException{
int a[]={2,4,5,7,1,2,3,6};
System.out.println("Unsorted Array");
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
try{
MergeSort m=new MergeSort();
a=m.merge(a, 0, 3, 7);
}catch(Exception e ){
e.printStackTrace();
}
System.out.println("\nSorted Array");
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
int [] merge(int a[],int p,int q,int r){
//int a[]={2,4,5,7,1,2,3,6};
int n1=q-p+2;
int n2=r-q+1;
int L[]=new int[n1];
int R[]=new int[n2];
for(int i=0;i<n1 -1;i++){
L[i]=a[p+i];
}
L[n1 -1] = Integer.MAX_VALUE;
//q=q+1;
for(int i=0;i<n2 -1;i++){
R[i]=a[q+i+1];
}
R[n2-1] = Integer.MAX_VALUE;
//L[n1+1]=9;
///R[n2+1]=9;
int i=0,j=0;
for(int k = p; k <= r; k++){
if(L[i] <= R[j]){
a[k] = L[i++];
}else{
a[k] = R[j++];
}
}
return a;
}
}
我正在执行这个合并排序程序,但它抛出了越界异常,我不明白为什么会这样,我检查了所有数组参数是否满足,但它仍然有问题。
public class MergeSort
{
public static void main(String[] args) throws ArrayIndexOutOfBoundsException
{
int a[]={2,4,5,7,1,2,3,6};
System.out.println("Unsorted Array");
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+" ");
}
try{
MergeSort m=new MergeSort();
a=m.merge(a, 0, 3, 7);
}
catch(Exception e )
{
e.printStackTrace();
}
System.out.println("\nSorted Array");
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+" ");
}
}
int [] merge(int a[],int p,int q,int r)
{
//int a[]={2,4,5,7,1,2,3,6};
int n1=r-p+1;
int n2=r-q;
int L[]=new int[n1+1];
int R[]=new int[n2+1];
for(int i=0;i<n1;i++)
{
L[i]=a[i];
}
q=q+1;
for(int i=0;i<n2-1;i++)
{
R[i]=a[q+i];
}
//L[n1+1]=9;
///R[n2+1]=9;
int i=0,j=0;
for(int k=0;k<r;k++)
{
if(L[i]<=R[j])
{
a[k]=L[i];
i++;
}
else
{
a[k]=R[j];
j++;
}
}
return a;
}
}
Unsorted Array
2 4 5 7 1 2 3 6 java.lang.ArrayIndexOutOfBoundsException: 5
at scom.id.MergeSort.merge(MergeSort.java:63)
at scom.id.MergeSort.main(MergeSort.java:20)
Sorted Array
1 2 2 3 0 0 3 6
第51行需要
for(int k=0;k<r-1;k++)
这让它对我有用
我做了一些改动,将左右两个数组合并到一个已排序的数组中 element.Here 是 运行 正确的解决方案。 希望这能帮助您了解问题所在。
public class MergeSort {
public static void main(String[] args) throws ArrayIndexOutOfBoundsException {
int a[] = {2, 4, 5, 7, 1, 2, 3, 6};
System.out.println("Unsorted Array");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
MergeSort m = new MergeSort();
a = m.merge(a, 0, 3, 7);
System.out.println("\nSorted Array");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
int[] merge(int a[], int p, int q, int r) {
//int a[]={2,4,5,7,1,2,3,6};
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[i];
}
for (int i = 0; i < n2; i++) {
R[i] = a[q + i + 1];
}
//L[n1+1]=9;
///R[n2+1]=9;
int i = 0, j = 0 , k = 0;
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++;
}
return a;
}
}
首先错误的是分配给左右数组以临时保存的数组大小。
我对您的代码进行了一些修改以使其工作。给你:
public class MergeSort {
public static void main(String[] args) throws ArrayIndexOutOfBoundsException{
int a[]={2,4,5,7,1,2,3,6};
System.out.println("Unsorted Array");
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
try{
MergeSort m=new MergeSort();
a=m.merge(a, 0, 3, 7);
}catch(Exception e ){
e.printStackTrace();
}
System.out.println("\nSorted Array");
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
int [] merge(int a[],int p,int q,int r){
//int a[]={2,4,5,7,1,2,3,6};
int n1=q-p+2;
int n2=r-q+1;
int L[]=new int[n1];
int R[]=new int[n2];
for(int i=0;i<n1 -1;i++){
L[i]=a[p+i];
}
L[n1 -1] = Integer.MAX_VALUE;
//q=q+1;
for(int i=0;i<n2 -1;i++){
R[i]=a[q+i+1];
}
R[n2-1] = Integer.MAX_VALUE;
//L[n1+1]=9;
///R[n2+1]=9;
int i=0,j=0;
for(int k = p; k <= r; k++){
if(L[i] <= R[j]){
a[k] = L[i++];
}else{
a[k] = R[j++];
}
}
return a;
}
}