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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 苏伯亚 中级黑马   /  2014-4-9 20:07  /  1360 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

开始复习后看到了排序和查找。我随机输入一个不是顺序的数组。先排序后在折半查找,为什么总是返回值不对?下面是代码:
class Demo
{
        public static void main(String[] args)
        {
                int [] arr={1,31,65,74,98,100};
                bianli(arr);
                paixu(arr);
                //maopo(arr);
                bianli(arr);
                int p=getIndex(arr,31)+1;
                System.out.println(p);
               
        }

        public static void bianli(int [] arr)//遍历数组并输出
        {
                System.out.print("【");
                for (int x=0;x<arr.length ;x++ )
                {
                        if(x!=arr.length-1)
                        System.out.print(arr[x]+",");
                        else
                                System.out.println(arr[x]+"】");
                }
        }

           public static void paixu(int [] arr)//选择排序
        {
                for (int x=0;x<arr.length-1 ;x++ )
                {
                        for (int y=x+1;y<arr.length ;y++ )
                        {
                            if (arr[x]<arr[y])
                             {
                                    swp(arr,x,y);
                             }
                        }
                }
        }
        public static void maopo(int [] arr)//冒泡排序
        {
                for (int x=0;x<arr.length-1 ;x++ )
                {
                        for (int y=0;y<arr.length-x-1 ;y++ )
                        {
                                if (arr[y]<arr[y+1])
                             {
                                   swp(arr,y,y+1);
                             }
                        }
                }

        }
        public static void swp(int [] arr,int a,int b)//交换两个变量的值
        {
                arr[a]=arr[a]^arr[b];
                arr[b]=arr[a]^arr[b];
                arr[a]=arr[b]^arr[a];
        }
        public static int getIndex(int [] arr,int key)//折半查找 返回角标。
        {
                int min=0,max=arr.length-1,mid;
                //System.out.println("min="+min);
                //System.out.println("max="+max);
                while(min<=max)
                {
                        mid=(max+min)>>1;
                        //System.out.println("mid="+mid);
                        if(key>arr[mid])
                                min=mid+1;
                        else if(key<arr[mid])
                                max=mid-1;
                        else
                                return mid;
                }
                return -1;
        }
}


如果不进行排序直接查找返回值就是正确的。但是一旦进行了排序操作返回值就是0。这是为什么呢?
即使输入的是有序的数组,进行排序后返回值也是错的。求解答

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

5 个回复

倒序浏览
按你的折半查找的算法,参数必须是从小到大的排序,你的排序方法却是从大到小的。。。把排序中的
if (arr[x]<arr[y])  改成  if (arr[x]>arr[y])就行了。
回复 使用道具 举报
折半查询必须保证数组中是数有顺序才可以
回复 使用道具 举报
这是你排序前和排序后的结果:

【1,31,65,74,98,100】

【100,98,74,65,31,1】

你排序之后是倒序的,

所以在折半时也应该按照倒序的思路来,

要么就把排序调整一下!

评分

参与人数 1黑马币 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  while(min<=max)
                {
                        mid=(max+min)>>1;
                        //System.out.println("mid="+mid);
                        if(key>arr[mid])
                                min=mid+1;//楼主的排序是降序排列, 如果要找的比arr[mid]大, 则应该是凌max=mid吧
                        else if(key<arr[mid])
                                max=mid-1;// 同样, 要是key比arr[mid]小, 则需要改变的是min=mid
                        else
                                return mid;
                }
或者 楼主把上面两个判断中,>改成< , <改成> 可以得到想要的结果.
用eclipse跑一下, 可以结果如下:
【1,31,65,74,98,100】
【100,98,74,65,31,1】
5



评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
张耀扬 发表于 2014-4-9 22:42
while(min>1;
                        //System.out.println("mid="+mid);
                        if( ...

嗯 谢谢 忽视这个小地方了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马