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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Michael_xpd 于 2013-11-27 14:10 编辑
  1. package Demo;
  2. /**
  3. * 需求:实现折半查找的另一种方法
  4. * 思路:用while循环控制循环折半查找
  5. * 注:当我用小于数组中最大值的整数变量测试时,能返回正确的变量。
  6. *                 当我用大于数组中最大值的整数变量时,不能返回正确的-1
  7. *
  8. *
  9. * */

  10. public class Day0203 {

  11.         public static void main(String[] args) {
  12.                 // TODO 自动生成的方法存根
  13.                 int arr[]={12,33,4,54,8,13,9};
  14.                 sort(arr);
  15.                 System.out.println("排序后");
  16.                 printArray(arr);
  17.                 int index=0;
  18.                 index=halfSort(arr,55);
  19.                 System.out.println(index);

  20.         }
  21.         //定义一个折半查找的功能halfSort()
  22.         public static int halfSort(int arr[],int key){
  23.                 int min=0,max=arr.length,mid;
  24.                 /**int min=0;
  25.                 int max=arr.length;
  26.                 int mid;*/
  27.                 while(min<=max){
  28.                         mid=(min+max)/2;
  29.                         
  30.                         if(arr[mid]<key)
  31.                                 min=mid+1;
  32.                         else if(arr[mid]>key)
  33.                                 max=mid-1;
  34.                         else return mid;        
  35.                 }
  36.                 return -1;
  37.         }
  38.         public static void sort(int arr[]){
  39.                 for(int i=0;i<arr.length;i++){
  40.                         for(int j=i+1;j<arr.length;j++){
  41.                                 if(arr[i]>arr[j]){
  42.                                         arr[i]=arr[i]^arr[j];
  43.                                         arr[j]=arr[i]^arr[j];
  44.                                         arr[i]=arr[i]^arr[j];
  45.                                 }
  46.                         }
  47.                 }
  48.         }
  49.         public static void printArray(int arr[]){
  50.                 for(int i=0;i<arr.length;i++){
  51.                         System.out.print(arr[i]+",");
  52.                 }
  53.                 System.out.println();
  54.         }

  55. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

4 个回复

正序浏览
先说一下代码如何修改,和二楼三楼的修改方法是一样的
应把"max = arr.length;"改为"max = arr.length-1"因为min和max存放的是数组的第一元素和最后一个元素的下标,而数组的最后一个元素下标是arr.length-1
以下是我自己对楼主运行结果的分析和理解:
1、楼主第一次传递一个小于数组最大值时返回了正确结果,未报异常
这是因为传递的值小于数组最大值,即key < arr[max-1](max = arr.length),程序最多访问到
arr[max-1],不会访问到arr[max],所以程序不会出现数组下标越界
1.楼主第二次传递的值大于数组最大值,程序报异常
这是因为传递的值大于数组最大值,即key >arr[max-1](max = arr.length) ,程序循环运算
最终会访问到arr[max],此时就出现了数组下标越界,程序停止运行
这是我自己的理解,希望对你有所帮助

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报 1 0
max应该为arr.length-1吧

这个问题毕老师视频里面讲解过 我说下我的理解
折半查找主要理解两个问题:1.折半的条件(何时该继续折半);2.折半角标的变化(需要折半后max、min、和mid的关系)
折半条件有两个:1. while(arr[mid] !=key){ if(min > max ) return -1;}      
                         2.while(min <= max){}

折半角标变化:1.当arr[mid]>key时,即key在数组前半段,故应将max移到前面,即max=mid-1;
                     2.当arr[mid]<key时,即key在数组后半段,故应将min移到后面,即min=mid+1;

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报 1 0
把halfSort方法改成
  1. public static int halfSort(int[] arr,int key)
  2.         {
  3.                 int min =0,max =arr.length-1,mid;
  4.                 while(min <= max)
  5.                 {
  6.                         mid =(min + max)/2;
  7.                         if(key > arr[mid])
  8.                                 min = mid +1;
  9.                         else if(key < arr[mid])
  10.                                 max = mid -1;
  11.                         else
  12.                                 return mid;
  13.                 }
  14.                 return -1;
  15.         }
复制代码

你的max值定义错了,应该是int max = arr.length - 1;你定义的int max = arr.length;会报异常,数组是从0角标开始,所以最大角标比数组长度少1。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
                int index=0;
                index=halfSort(arr,55);  // 这行错了,key的值不在范围内。你再试试            
               System.out.println(index);


评分

参与人数 1黑马币 +3 收起 理由
简★零度 + 3

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马