黑马程序员技术交流社区
标题: [请教]排序问题? [打印本页]
作者: Friends★ 时间: 2012-4-18 08:34
标题: [请教]排序问题?
本帖最后由 Friends★ 于 2012-4-18 08:36 编辑
请问这段代码哪里出了问题,我执行的时候,Eclipse也不报错,但是就是没有结果输出,而且执行的时候还会把我电脑搞死机,好像执行很费劲,问题在哪?
class Test{
public static void main(String[] args) {
int[] array={3,4,6,8,9,10};
int index=halfSearch(array,8);
System.out.println(index);
}
public static int halfSearch(int[] array,int key){
int min=0;
int max=array.length-1;
int mid=(min+max)/2;
while(array[mid]!=key){
if(array[mid]>key)
min=mid+1;
else if(array[mid]<key)
max=mid-1;
}
* return mid; }
}
作者: 张小庆 时间: 2012-4-18 08:46
楼主你while里面写错了,应该这样的:
if(key>array[mid])
min=mid+1;
else if(key<array[mid])
max=mid-1;
if(min>max)
return -1;
mid=(max+min)/2
作者: 朱鹏举 时间: 2012-4-18 09:08
while循环不能这么写,你写的当array[mid]!=key时,一直循环,要知道array[mid]=key 的几率很小,这样就成了死循环。最好使用if。
作者: 施俊 时间: 2012-4-18 09:21
循环中判断mid数值和key的大小有误,按照你的判断方法array[mid]>key,说明key在min与mid之间,所以应该将中间值mid改为最大值max,而不是你写的最小值改为中间值,第二个判断同理。
作者: 袁培育 时间: 2012-4-18 09:45
在while循环里,当arr[mid]>key时,应该是max=mid-1;当arr[mid]<key时应该是min=mid+1;l另外,你的mid值咋i循环里没有被改变,这样就一直是拿第一个arr[mid]值即arr[2]在和8比较,所以构成死循环,如果在循环里加一句mid=(min+max)/2就可以改变mid的值,但这样也有问题,原因是你循环结束的条件选错了,有可能造成max小于min的情况。
作者: Friends★ 时间: 2012-4-18 09:59
知道哪里错了,谢咯!
作者: 林豪 时间: 2012-4-18 10:00
public static int halfSearch(int[] array,int key){
int min=0;
int max=array.length-1;
int mid=(min+max)/2;
while(min<=max){
if(array[mid]>key)
min=mid+1;
else if(array[mid]<key)
max=mid-1;
}
* return mid; }
}
这段写错了,既然中值比KEY大,那么你KEY应该在左边,应该是
public static int halfSearch(int[] array,int key){
int min=0;
int max=array.length-1;
int mid=(min+max)/2;
while(array[mid]!=key){
if(array[mid]<key)
min=mid+1;
else if(array[mid]>key)
max=mid-1;
else
return mid;
}
return -1; }
}
这样就可以了,运行失败可以拿张纸写写过程,要考虑找不到的情况!!
作者: 韩新凯 时间: 2012-4-18 10:07
1.把 mid=(min+max)/2; 添加到while循环的末尾。
2.while循环里面的 if(array[mid]>key) min=mid+1; 改为if (array[mid] > key) max = mid - 1;
3.while循环里面的 else if(array[mid]<key) max=mid-1; 改为 else if (array[mid] < key) min = mid + 1;
4.在while循环外面添加判定条件else if (array[mid] < key) min = mid + 1;//如果没有找到要查找的数则返回-1.
5.修改后的代码如下:else if (array[mid] < key)
min = mid + 1;
作者: 韩新凯 时间: 2012-4-18 10:09
刚才代码没复制好:public class Test {
public static void main(String[] args) {
int[] array = { 3, 4, 6, 8, 9, 10 };
int index = halfSearch(array, 5);
System.out.println(index);
}
public static int halfSearch(int[] array, int key) {
int min = 0;
int max = array.length - 1;
int mid = (min + max) / 2;
while (array[mid] != key) {
if (array[mid] > key)
max = mid - 1;
else if (array[mid] < key)
min = mid + 1;
mid = (min + max)/2;
}
if(min>max){
return -1;
}
return mid;
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |