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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 水。。。海 于 2013-6-28 22:43 编辑
  1. /**
  2. *折半查找训练
  3. *author @ 倪成伟
  4. */
  5. /*思路:1.折半查找的基础是数组有序
  6.             2.找出中间角标代表的元素在与给定值比较,
  7.                   通过改变最大与最小角标改变中间值,进
  8.                   而找出所给值。
  9. */
  10. class HalfSearch
  11. {
  12.         public static int halfSearch(int a,int[] arr)
  13.         {
  14.                 int mid;
  15.                 int min=0;
  16.                 int max=arr.length-1;
  17.                 for(int x=0;x<arr.length;x++)
  18.                 {
  19.                         mid=(min+max)/2;
  20.                         if(arr[mid]>a)
  21.                         {
  22.                                 max=mid;
  23.                         }
  24.                         else if(arr[mid]<a)
  25.                         {
  26.                                 min=mid;
  27.                         }
  28.                         else if(arr[mid]==a)
  29.                         {
  30.                                 return mid;
  31.                         }
  32.                         else if(min>max)                   <font color="#ff0000">//这个代码去掉esle ,加上esle就执行不到这句话了</font>
  33.                         {
  34.                                 return -1;
  35.                         }
  36.                 }
  37.         }
  38.         public static void main(String[] args)
  39.         {
  40.                 int a=6;
  41.                 int[] arr={1,2,5,8,9,10,21,22,33};
  42.                 System.out.println(halfSearch(a,arr));
  43.         }
  44. }
复制代码
这个程序是我构思的,编译后结果如图,想问的第一,这个程序可不可以实现折半查找?第二,返回结果说我没有返回值,但是我程序里设计了返回值,为什么?
  1. /**
  2. *折半查找训练
  3. *author @ 倪成伟
  4. */
  5. /*思路:1.折半查找的基础是数组有序
  6.             2.找出中间角标代表的元素在与给定值比较,
  7.                   通过改变最大与最小角标改变中间值,进
  8.                   而找出所给值。
  9. */
  10. class HalfSearch
  11. {
  12.         public static int halfSearch(int a,int[] arr)
  13.         {
  14.                 int min=0;
  15.                 int max=arr.length-1;
  16.                 int        mid=(min+max)/2;
  17.                 while(arr[mid]!=a)
  18.                 {
  19.                         if(arr[mid]>a)
  20.                         {
  21.                                 max=mid-1;
  22.                         }
  23.                         else if(arr[mid]<a)
  24.                         {
  25.                                 min=mid+1;
  26.                         }
  27.                         else if(min>max)                                       
  28.                                 return -1;
  29.                         mid=(min+max)/2;
  30.                 }
  31.                         return mid;
  32.         }
  33.         public static void main(String[] args)
  34.         {
  35.                 int a=6;
  36.                 int[] arr={1,2,5,8,9,10,21,22,33};
  37.                 System.out.println(halfSearch(a,arr));
  38.         }
  39. }
复制代码
这个是修改过的,但是,查找不存在的数还是不行。

G$9G)Z_FC64T8ZS8D4UF%JH.jpg (26.43 KB, 下载次数: 0)

结果

结果

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

10 个回复

倒序浏览
本帖最后由 王楚鑫 于 2013-6-28 21:14 编辑

我改了下你的代码、可以完成功能了、、、你看看能不能帮到你吧
  1. /**
  2. *折半查找训练
  3. *author @ 倪成伟
  4. */
  5. /*思路:1.折半查找的基础是数组有序
  6.             2.找出中间角标代表的元素在与给定值比较,
  7.                   通过改变最大与最小角标改变中间值,进
  8.                   而找出所给值。
  9. */
  10. class HalfSearch
  11. {
  12.         public static int halfSearch(int a,int[] arr)
  13.         {
  14.                 int mid;
  15.                 int min=0;
  16.                 int max=arr.length-1;
  17.                 while(min<=max)//保证查找区间非空
  18.                 {
  19.                         mid=(min+max)/2;
  20.                        if(arr[mid]==a)
  21.                         {
  22.                                return mid;//查找成功返回
  23.                         }
  24.                         else if(arr[mid]>a)
  25.                         {
  26.                                 max=mid-1;//缩小查找区间
  27.                         }
  28.                         else
  29.                         {
  30.                                 min=mid+1;//缩小查找区间
  31.                         }
  32.      
  33.                 }
  34.         return (-1);//查找失败
  35.         }
  36.         public static void main(String[] args)
  37.         {
  38.                 int a=6;
  39.         //int a=22;
  40.                 int[] arr={1,2,5,8,9,10,21,22,33};
  41.                 System.out.println(halfSearch(a,arr));
  42.         }
  43. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
王楚鑫 发表于 2013-6-28 21:09
我改了下你的代码、可以完成功能了、、、你看看能不能帮到你吧

你改过就可以完成,我看了你的代码你就是该了while循环里的条件,不过我觉得我的条件也没错啊?为什么就没结果?
回复 使用道具 举报
本帖最后由 sunriselzz 于 2013-6-28 22:29 编辑

这是我个人总结的折半查找的几个不同方式,包括折半查找的优化,
以及调用数组工具类Arrays的二分查找方法直接进行二分查找,
顺序查找,遍历等. 有不足的地方,欢迎分享指正,谢谢!

  1. import java.util.Arrays;

  2. public class ArraysSearch {

  3.         /**
  4.          * 数组常见操作:
  5.                   
  6.           查找: 顺序查找  折半查找
  7.                   
  8.          * @param args
  9.          */
  10.         public static void main(String[] args) {
  11.                 //数组的定义及初始化
  12.                 int[] arr = new int[]{0,11,23,34,42,55,63,78,88,90};
  13.                 //增强for循环遍历数组
  14.                 printArr1(arr);       
  15.                
  16.                 System.out.println("\n 查找数组中的某个元素: ");
  17.                 //顺序查找
  18.                 int index1 = getIndex(arr,63);
  19.                 findElement(index1);       
  20.                 //折半查找1
  21.                 int index3 = binarySearch(arr,63);
  22.                 findElement(index3);
  23.                 //折半查找2
  24.                 int index2 = halfSearch(arr,63);
  25.                 findElement(index2);
  26.                 //折半查找3
  27.                 int index4 = Arrays.binarySearch(arr, 77);
  28.                 //如果元素不存在,返回这个元素负的插入位置再-1
  29.                 findElement(index4);
  30.                
  31.         }
  32.        

  33.         //折半查找1
  34.         public static int binarySearch(int[] arr, int key) {
  35.                 int min,max,mid;
  36.                 min = 0;
  37.                 max = arr.length-1;
  38.                 mid = (min+max)/2;
  39.                
  40.                 while(key != arr[mid]){
  41.                         if(key < arr[mid]){
  42.                                 max = mid - 1;
  43.                         }else{
  44.                                 min = mid + 1;
  45.                         }
  46.                        
  47.                         if(max < min){
  48.                                 return -1;
  49.                         }
  50.                         mid = (min+max)/2;
  51.                 }
  52.                 return mid;
  53.         }

  54.         //打印所要查找元素的结果
  55.         public static void findElement(int index){
  56.                 if(-1 != index){
  57.                         System.out.println(" 所要查找元素在数组中的下标为: "+index);
  58.                 }else{
  59.                         System.out.println(" 数组中不存在该元素! ");
  60.                 }
  61.         }
  62.        
  63.         //对排序后的元素进行折半查找的优化2
  64.         public static int halfSearch(int[] arr,int key) {
  65.                 int low = 0;
  66.                 int high = arr.length-1;
  67.                 int mid;
  68.                
  69.                 while(low <= high){
  70.                         mid = (low+high)>>1;
  71.                         if(key > arr[mid]){
  72.                                 low = mid + 1;
  73.                         }else if(key < arr[mid]){
  74.                                 high = mid - 1;
  75.                         }else{
  76.                                 return mid;
  77.                         }
  78.                 }
  79.                 return -1; //若返回min,则可以获得往这个有序的数组中新存入一个元素,
  80.                 //并依然保持这个数组有序的下标
  81.         }

  82.         //查找数组中的元素
  83.         public static int getIndex(int[] arr, int key) {
  84.                 for (int i = 0; i < arr.length; i++) {
  85.                         if(key == arr[i]){
  86.                                 return i;
  87.                         }
  88.                 }
  89.                 return -1;
  90.         }
  91.        
  92.         //普通for循环遍历数组arr
  93.         public static void printArr2(int[] arr) {
  94.                 System.out.print(" 普通for循环遍历数组: { ");
  95.                 for (int i = 0; i < arr.length; i++) {
  96.                         if(i != arr.length-1){
  97.                                 System.out.print(arr[i]+",");
  98.                         }else{
  99.                                 System.out.println(arr[i]+" }");
  100.                         }
  101.                 }
  102.         }
  103.         //增强for循环遍历数组arr
  104.         public static void printArr1(int[] arr) {
  105.                 System.out.print(" 增强for循环遍历数组: { ");
  106.                 for(int x : arr){
  107.                         System.out.print(x+" ");
  108.                 }
  109.                 System.out.println("}");
  110.         }

  111. }
复制代码

ArraySearch.JPG (24.53 KB, 下载次数: 0)

ArraySearch.JPG

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 很给力!

查看全部评分

回复 使用道具 举报
王楚鑫 发表于 2013-6-28 21:09
我改了下你的代码、可以完成功能了、、、你看看能不能帮到你吧

我找到原因了,我写在代码上了,你可以看下
回复 使用道具 举报
sunriselzz 发表于 2013-6-28 22:28
这是我个人总结的折半查找的几个不同方式,包括折半查找的优化,
以及调用数组工具类Arrays的二分查找方法直 ...

这个我可以好好研究了
回复 使用道具 举报
这是我刚才做的。也运行出来了,你试试吧
public class Test10{
        public static int halfSearch(int key,int[] arry){
                int min=0;
                int max=arry.length-1;
                int mid=(min+max)/2;
       
                for(int i=0;i<arry.length-1;i++){
                        if(key<arry[mid]){
                                max=mid;
                                mid=(min+max)/2;
                        }
                        else if(key>arry[mid]){
                                min=mid;
                                mid=(min+max)/2;
                        }
                }
            if(key==arry[mid]){
                        return mid;
                }
            else if(key==arry[mid+1]){
                    return mid+1;
            }
            else return -1;
        }
        public static void main(String[] args) {
                int[] arr={1,2,5,8,9,10,21,22,33};
                int index=halfSearch(22,arr);
                System.out.println(index);
                    }
}

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
张海龙 发表于 2013-6-28 22:39
这是我刚才做的。也运行出来了,你试试吧
public class Test10{
        public static int halfSearch(int key,in ...

你这个写的复杂了,我优化了下你可以看下
  1. /**
  2. *折半查找训练
  3. *author @ 倪成伟
  4. */
  5. /*思路:1.折半查找的基础是数组有序
  6.             2.找出中间角标代表的元素在与给定值比较,
  7.                   通过改变最大与最小角标改变中间值,进
  8.                   而找出所给值。
  9. */
  10. class HalfSearch
  11. {
  12.         public static int halfSearch(int a,int[] arr)
  13.         {
  14.                 int min=0;
  15.                 int max=arr.length-1;
  16.                 int        mid=(min+max)/2;
  17.                 while(arr[mid]!=a)
  18.                 {
  19.                         if(arr[mid]>a)
  20.                         {
  21.                                 max=mid-1;
  22.                         }
  23.                         else if(arr[mid]<a)
  24.                         {
  25.                                 min=mid+1;
  26.                         }
  27.                         if(min>max)                                       
  28.                                 return -1;
  29.                         mid=(min+max)/2;
  30.                 }
  31.                         return mid;
  32.         }
  33.         public static void main(String[] args)
  34.         {
  35.                 int a=6;
  36.                 int[] arr={1,2,5,8,9,10,21,22,33};
  37.                 System.out.println(halfSearch(a,arr));
  38.         }
  39. }
复制代码
回复 使用道具 举报
我是为了用你的那个for循环,写的复杂了点,其实把min=mid;改为min=mid+1;  max=mid;改为max=mid-1;这样最后的 else if(key==arry[mid+1]){
                     return mid+1;
             }
就可以删除了。就简单了
回复 使用道具 举报
张海龙 发表于 2013-6-28 23:06
我是为了用你的那个for循环,写的复杂了点,其实把min=mid;改为min=mid+1;  max=mid;改为max=mid-1;这样最 ...

有道理 ,有想法:lol
回复 使用道具 举报
支持了。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马