public class final_test { public void median(int x[],int y[],int n){

int m=n;
if(m==1){
int z= (x[0]+y[0])/2;
System.out.println("中位数为:"+z);
}

int h=m/2;
if(m%2==1){//奇数

if(x[h]<y[h]){
for(int i=0;i<=m;i++){
x[i]=x[h+i];
}
}

else{
for(int i=0;i<=m;i++){
y[i]=y[h+i];
}
}

median(x,y,h);
}

else{//偶数

if(x[h-1]<y[h-1]){
for(int i=0;i<=m;i++)
 x[i]=x[h+i];//这边报错
}

else{
for(int i=0;i<=m;i++)
 y[i]=y[h+i];

}

median(x,y,h);
}
}

public static void main(String[] args) { int x[]={1,2,3,5,7,8,9,10,23,29};
int y[]={2,4,6,7,8,11,15,19,21,27};
int n=10;
final_test ft=new final_test();
ft.median( x, y,n);//这边也报错
}}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at final_test.median(final_test.java:33)
at final_test.main(final_test.java:52)

大家帮帮忙哈!

解决方案 »

  1.   

    ArrayIndexOutOfBoundsException 数组下标越界异常
      

  2.   

    正解,把int n=10;把n的值改大一点。
      

  3.   

    for(int i=0;i<=m;i++)
    x[i]=x[h+i];//这边报错 这里走的是 h=m/2 && m%2==0 这个分支
    所以要改成for(int i=0;i<h;i++)
    举个例子: m=2, 则 h=1, 代码变成
    for(int i=0;i<=2;i++){
      x[i] = x[1+i];
    }
    i = 0 不越界
    i = 1, 就越界了话说我没看明白你想写个啥功能,貌似m可以乱给,就不只是这里的问题了。
    例如
    public static void main(String[] args) {int x[]={1,2,3};
    int y[]={8,9,10};
    int n=5;
    final_test ft=new final_test();
    .。。
      

  4.   

    循环的条件不是<=只要<就OK了
      

  5.   

    x[i] = x[h + i];// 这边报错,x的长度为m,最多x[m-1],x[m]就越界了,当i = m的时候在加上h,能不越界吗?说说你的程序是干什么的吧!
      

  6.   

    for(int i=0;i<=m;i++)
    x[i]=x[h+i];//这边报错 这里走的是 h=m/2 && m%2==0 这个分支
    是的,写错了,循环体的m改为h
    ,n改为x.length,可运行时还是那个地方出错
      

  7.   

    public class final_test { public void median(int x[],int y[],int n){

    int m=n;
    if(m==2){
    if(x[0]>y[0]){
    if(x[0]<x[1])
        System.out.print("中位数为:"+x[0]+",");
    else
    System.out.print("中位数为:"+x[1]+",");
    if(y[0]>y[1])
    System.out.println(y[0]);
    else
    System.out.println(y[1]);
    }

    else{
    if(x[0]>x[1])
        System.out.print("中位数为:"+x[0]+",");
    else
    System.out.print("中位数为:"+x[1]+",");
    if(y[0]<y[1])
    System.out.println(y[0]);
    else
    System.out.println(y[1]);
    }
    }

    else{
    int h=m/2;
    if(m%2==1){//奇数

    if(x[h]<y[h]){
    for(int i=0;i<=h;i++){
    x[i]=x[h+i];
    }
    }

    else{
    for(int i=0;i<=h;i++){
    y[i]=y[h+i];
    }
    }

    median(x,y,h+1);
    }

    else{//偶数

    if(x[h-1]<y[h-1]){
    for(int i=0;i<=h;i++)
     x[i]=x[h-1+i];
    }

    else{
    for(int i=0;i<=h;i++)
     y[i]=y[h-1+i];

    }

    median(x,y,h+1);
    }
    }
    }

    public static void main(String[] args) { int x[]={1,2,3,4,5,7,9,11};
    int y[]={0,2,4,5,6,7,8,10};
    int n=x.length;
    final_test ft=new final_test();
    ft.median( x, y,n);
    }}
    呵呵调试好了,谢谢大家哈,这个程序是对两个有序数组求中位数,时间复杂度为o(logn)调试错是if和else的花括号没弄好,大家辛苦了