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)
大家帮帮忙哈!
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)
大家帮帮忙哈!
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();
.。。
x[i]=x[h+i];//这边报错 这里走的是 h=m/2 && m%2==0 这个分支
是的,写错了,循环体的m改为h
,n改为x.length,可运行时还是那个地方出错
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的花括号没弄好,大家辛苦了