A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曹亚辉 中级黑马   /  2016-9-10 21:56  /  491 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


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);
        }
}

2 个回复

倒序浏览
当你到78和99时,你发现没有你的mid=(12+13)/2一直都是等于12的,也就是你一直在循环这个比较,应该是从mid的后一个开始,然后就可以了,你试一下
回复 使用道具 举报
这句代码改成:
  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;
}
这样就避免了你的索引在整除时陷入死循环的困惑了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马