日期:2014-05-20  浏览次数:20740 次

关于java的排序的问题
小弟有个程序,不知为什么改变数组大小,输入的数有的合适,能够得到结果,而有的却报错,报数组越界,不知为什么。
比如输入1 2 3 4 5时可以正确得到结果,如果输入
10 11 12 13 14 就会报错?为什么?是什么地方不对吗?希望各位可以解释一下,不胜感激!


/*题目:一个有序线性表,有n个数,任给一个x,找出线性表中的两个数使得这两个数的和是x。
 * 这里的线性表用数组表示
 * */
import java.io.*;

public class Bsearch {
public static void main(String[] args) throws NumberFormatException, IOException {
int size = 5;
int[] arr = new int[size];
System.out.println("请输入的一列数:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for(int i = 0;i<arr.length;i++)
{
int change = Integer.parseInt(br.readLine());
arr[i]= change;
}
System.out.println("您输入的一组数是:");
for(int i = 0;i<arr.length;i++)
{
System.out.print(" "+arr[i]);
}
System.out.println(" ");
System.out.println("请任输入的一个数:");
BufferedReader brd = new BufferedReader(new InputStreamReader(System.in));
int x = Integer.parseInt(brd.readLine());
Search sh=new Search();
int rest,j;
for(int i = 0; i < arr.length; i++)
{
rest = x - arr[i];
j = sh.search(arr, x, rest);
if(j == -1) break;
else
System.out.println("第"+(i+1)+"个数和"+"第" +(j+1)+"个数的和是 "+x);
}
}
}
class Search
{
public int search(int []a,int n,int k)
{
int left = 0;
int right = n;
while(left<=right)
{
int middle=(left+right)/2;
if(k==a[middle])
return middle;
else if(k < a[middle])
{
right = middle-1;
}
else
{
left=middle+1;
}
}
return -1;
}
}

------解决方案--------------------
不知道你的search方法用来做什么的,用二分法找一个值?

这个思路很明显错的
int left = 0;
int right = n;


int middle=(left+right)/2;
一开始你的right就是要找的数
你的数组长度就是5,随便输入一个数大于5*2,你的程序就要报错了.
不相信就试试看...

int middle=(0+5*2)/2;-->5,已经超出下标了...a[middle]就会报错了