黑马程序员技术交流社区

标题: 关于数组排序后在折半查找的问题 [打印本页]

作者: 苏伯亚    时间: 2014-4-9 20:07
标题: 关于数组排序后在折半查找的问题
开始复习后看到了排序和查找。我随机输入一个不是顺序的数组。先排序后在折半查找,为什么总是返回值不对?下面是代码:
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。这是为什么呢?
即使输入的是有序的数组,进行排序后返回值也是错的。求解答

作者: tiuwing    时间: 2014-4-9 21:39
按你的折半查找的算法,参数必须是从小到大的排序,你的排序方法却是从大到小的。。。把排序中的
if (arr[x]<arr[y])  改成  if (arr[x]>arr[y])就行了。
作者: muma    时间: 2014-4-9 22:09
折半查询必须保证数组中是数有顺序才可以
作者: jingdou56    时间: 2014-4-9 22:30
这是你排序前和排序后的结果:

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

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

你排序之后是倒序的,

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

要么就把排序调整一下!
作者: 张耀扬    时间: 2014-4-9 22:42
  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




作者: 苏伯亚    时间: 2014-4-10 09:04
张耀扬 发表于 2014-4-9 22:42
while(min>1;
                        //System.out.println("mid="+mid);
                        if( ...

嗯 谢谢 忽视这个小地方了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2