黑马程序员技术交流社区

标题: 查找99不出现结果。 [打印本页]

作者: 曹亚辉    时间: 2016-9-10 21:56
标题: 查找99不出现结果。

package com.hui_binary;

import java.util.Scanner;

public class Demo2 {
        public static void main(String[] args) {
                //错误的代码,如果两个数例如查找99,最后两个的标志是12/13.两个的差一直是12,一只给mid赋值12,
                //一只都是角标为12的比较,不会有变化。所以会出错,也就是当两个star和end的平均数不是整数的时候
                //而且两个数还挨着,那么就会一直进行比较赋值。
                int[] arr = {3, 4, 9, 15, 23, 25, 36, 45, 45, 59, 59, 78, 78, 99};
                System.out.println("请输入你要查询的数字");
                int key = new Scanner(System.in).nextInt();
                int star = 0;
                int end = arr.length - 1;
                int mid = (star + end) / 2;
                while (!(arr[mid] == key)) {
                        if (arr[mid] > key) {
                                end = mid;
                                mid = (star + end) / 2;
                        } else if (arr[mid] < key) {
                                star = mid;
                                mid = (star + end) / 2;
                        }
                }

                System.out.println("查找的数字的位置是:" + mid);
        }
}
作者: Jarc    时间: 2016-9-11 09:42
当你到78和99时,你发现没有你的mid=(12+13)/2一直都是等于12的,也就是你一直在循环这个比较,应该是从mid的后一个开始,然后就可以了,你试一下
作者: 小东先森    时间: 2016-9-11 18:15
这句代码改成:
  if (arr[mid] > key) {
                                end = mid;
                                mid = (star + end) / 2;
改后:
if (arr[mid] > key) {
                                end = mid-1;
                                mid = (star + end) / 2;
这句改成:
else if (arr[mid] < key) {
                                star = mid;
                                mid = (star + end) / 2;
改成:
else if (arr[mid] < key) {
                                star = mid+1;
                                mid = (star + end) / 2;
最后加一个判断
if(max < min) {
            System.out.println("输入的数字不存在");
            return;
}
这样就避免了你的索引在整除时陷入死循环的困惑了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2