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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© masai158 高级黑马   /  2014-8-5 11:25  /  1749 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 masai158 于 2014-8-6 22:59 编辑
  1. public class zeban
  2. {

  3.         public static void main(String[] args)
  4.         {
  5.                 int[] arr ={1,3,5,7,9,11,13};
  6.                 int arrIndex = getIndex(arr,3);
  7.                 System.out.println(arrIndex);
  8.         }
  9.         
  10.         public static int getIndex(int[] arr,int key)
  11.         {
  12.                 int start = 0;
  13.                 int end = arr.length-1;
  14.                 int mid = (start+end)/2;
  15.                 while( start <= end )
  16.                 {
  17.                         mid = (start+end)/2;   
  18.                         if(arr[mid]>key)
  19.                                 end = mid-1;
  20.                         else if(arr[mid]<key)
  21.                                 start = mid +1;
  22.                         else if(arr[mid]==key)
  23.                                 return mid;
  24.                         else
  25.                                 return -1;
  26.                 }
  27.                 return -1;
  28.         }
  29. }
复制代码



这是刚刚帮人做的。。。
一直都是 1。。。1.1.1.1.1.1.1.1. 狂按了几下
结果刚刚突然一下崩个-1出来。。你们遇到过这种问题没有?

为什么呢???因为程序在运行,我将while循环里面的条件改成了 min<=end..然后就发生了各种不可思议的东西。
重启eclipse,速度慢点儿,好了。好像没问题了

9 个回复

倒序浏览
你 mid = (start+end)/2; 怎么写到while循环里了,那不每次都重新赋值啊
回复 使用道具 举报
你为什么在whlie 里又定义了一遍mid?  mid因该处现在if条件语句里面  是用来判断的
回复 使用道具 举报
Bule丶 发表于 2014-8-5 11:47
你 mid = (start+end)/2; 怎么写到while循环里了,那不每次都重新赋值啊

老毕的那视频忘记了。 就还有点儿思想,然后就模模糊糊的写出来了。我 应该将循环里面的那个赋值放到最else的后面去。因为上面做判断了。
回复 使用道具 举报
/*
        二分法查找
*/

public class binarySearch {

        public static void main(String[] args) {

                int[] arrs = { 1, 3, 5, 7, 9, 11, 13 };
               
                System.out.println(getIndex(arrs, 1));
                System.out.println(getIndex(arrs, 7));
                System.out.println(getIndex(arrs, 13));
        }

        // 使用二分查找法查找下标
        public static int getIndex(int[] arr, int value) {

                int start = 0;
                int end = arr.length;
                int mid = (start + end) / 2;

                while (start <= end) {
                        if (value < arr[mid]) {
                                end = mid - 1 ;
                        } else if (value > arr[mid]) {
                                start = mid + 1 ;
                        } else {
                                return mid;
                        }

                        mid = (start + end) / 2;
                }

                return -1; // 表示没有找到
        }
}

你的mid的刚开始的时候执行了两次,这样会丢掉一些数据!!!
回复 使用道具 举报
王峰峰 发表于 2014-8-6 23:34
/*
        二分法查找
*/

开始和结束这2个都没动。怎么会丢失数据呢。我只不过又重新赋值了???怎么丢失的?
回复 使用道具 举报
C.C. 初级黑马 2014-8-6 23:44:51
7#
学习学习
回复 使用道具 举报
masai158 发表于 2014-8-6 23:42
开始和结束这2个都没动。怎么会丢失数据呢。我只不过又重新赋值了???怎么丢失的? ...

你进行入getIndex()方法时,求了一次mid,没做任何处理又求了一次mid,这样一来不就丢了吗
回复 使用道具 举报
王峰峰 发表于 2014-8-7 20:04
你进行入getIndex()方法时,求了一次mid,没做任何处理又求了一次mid,这样一来不就丢了吗 ...

我好像没有发现数据丢失的。。因为mid 的值来源于 start 和 end 嘛。我只要没动 start 和 end 就算 求 100次。mid的值也不会变吧。
回复 使用道具 举报
代码不严谨,因该将while里的mid放在最后吧;
冒昧问一句 为什么类要用public修饰?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马