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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜天伟 中级黑马   /  2013-7-9 13:25  /  1371 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-10 22:28 编辑

一个有序数组,如果其中有重复的数,那么要查找这个数的位置的话,用一般查找的方法可以查找到这个数第一次出现的角标,那么如果使用折半查找呢?找出来的角标是哪个呢?还是第一次出现的角标吗?

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

8 个回复

倒序浏览
也是可以查到第一个出现的角标的啊while(start<end)
     {
         pos=(start+end)/2;
         if(a[pos]==num)  end=pos;//这里检测到要查的数字之后,不停止循环。
         else if(a[pos]<num) start=pos+1;
         else end=pos-1;
     }
if(a[start]==num) return start;//知道折半的开始位为要查的数字时才返回。


评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
使用折半查找的话,有可能是第一个,也有可能是第二个或者其他的。主要是看你的重复的数的角标位置。
回复 使用道具 举报
  1. public class Index
  2. {

  3. public static int halfSearch(int b [],int key)
  4. {
  5. int max=b.length-1,min=0,mid;
  6. while(min<=max)
  7. {
  8. mid=(max+min)>>1;
  9. if(key>b[mid])
  10. {
  11. mid=mid+1;
  12. }
  13. else if(key<b[mid])
  14. {
  15. min=mid-1;
  16. }
  17. else
  18. {
  19. return mid;
  20. }

  21. }
  22. return -1;
  23. }


  24. public static void main(String[] args)
  25. {

  26. int [] arr =new int[]{2,5,6,5,9,1};
  27. int index=halfSearch(arr,5);
  28. System.out.println("index="+index);
  29. }

  30. }
复制代码
我的
结果是:index=3,,,是第二个数的角标


评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
杜天伟 来自手机 中级黑马 2013-7-9 14:44:21
报纸
"O_忆_O 发表于 2013-7-9 13:44  也是可以查到第一个出现的角标的啊while(start

这个代码有点难懂啊
回复 使用道具 举报
楼上的不是有序数组,如果是有序数组折半查找也是元素一次出现的角标位置;
  1. public class Demo1 {
  2.         public static void main(String[] args) {
  3.                 int[] arr = {1,2,4,5,6,6,8,9};
  4.                 System.out.println("index= " + halfSearch(arr,6));
  5.         }

  6.         public static int halfSearch(int[] arr,int num) {       
  7.                 int min = 0,max = arr.length-1,mid = (max+min)/2;                                               
  8.                 while(arr[mid] != num) {                                                                                                               
  9.                         if(num > arr[mid]) {                                       
  10.                                 min = mid+1;                                                       
  11.                         }else if(num < arr[mid]) {                                       
  12.                                 max = mid-1;
  13.                         }
  14.                         if(min > max)                                                               
  15.                                 return -1;
  16.                         else
  17.                                 mid = (max+min)/2;                                               
  18.                 }
  19.                 return mid;
  20.         }
  21. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
杜天伟 来自手机 中级黑马 2013-7-9 21:27:31
7#
崔龙飞 发表于 2013-7-9 20:54  楼上的不是有序数组,如果是有序数组折半查找也是元素一次出现的角标位置; ...

你这个出来是第二个位置呀。
回复 使用道具 举报
杜天伟 发表于 2013-7-9 21:27
你这个出来是第二个位置呀。

汗,是的额。我运行的时候理解成第mid个元素了,重新运行了不同的数,都是第二个数的角标,你是遇到这方面的题了吗?
回复 使用道具 举报
杜天伟 来自手机 中级黑马 2013-7-10 09:30:46
9#
崔龙飞 发表于 2013-7-10 00:19  汗,是的额。我运行的时候理解成第mid个元素了,重新运行了不同的数,都是第二个数的角标,你是遇到这方 ...

不是,我是看到这块的时候突然想到的这个问题。有点好奇如果有相同数,找出来会是第几个
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马