黑马程序员技术交流社区

标题: New灬狼的学习笔记--ArrayTest05 [打印本页]

作者: New灬狼    时间: 2016-1-8 22:22
标题: New灬狼的学习笔记--ArrayTest05
/**
        New灬狼
        2015年12月30日20:11:15
*/

/*
需求:
        定义一个功能,根据给定的数,检查数组中是否存在同样的数;
        因为遍历整个数组需要时间,为了提高效率,我们使用折半查找法。

思路:
        1,什么是折半查找法呢?假如从1--100之间猜一个数,先猜50,说这个数比50大;
        再猜的范围就缩小到了51--100,再取一个中间说猜,75,说这个数比75小;
        那么范围就变成了51--74,再取一个中间数,因为24/2=12,再用62去比较;
        直到找到这个数。
        2,因为是和数组中的元素比较,所以存在两种情况,一种是有的时候,返回该数的角标;一种是没有。
        3,因为上面不断改变范围的时候是有规律的,所以可以用循环去做。
注意:
        !4,因为用给定的数和数组的数做比较,不断改变范围,所以要求数组必须是一个有序数组。
       

步骤:
        1,新建ArrayTest05.java;
        2,定义功能halfSearch;
        3,新建一个数组;排序;查找;检查功能是否正常。
*/

class ArrayTest05
{
        public static void main(String [] args)
        {
                int [] arr = {3,1,8,4,6,5,9,7,2};
                //先对数组从小到大排序
                java.util.Arrays.sort(arr);
                //查看排序
                display(arr);
                //查找给定的数,并把角标的数值赋值给half,以方便调用
                int half =halfSearch(arr,7);
                display(half);
                int half1 =halfSearch(arr,70);
                display(half1);       

                int h2 =halfSearch_2(arr,9);
                display(h2);
                h2 =halfSearch_2(arr,10);
                display(h2);
        }

        //定义函数halfSearch                返回值类型 int;参与运算的未知数,一个数组和一个给定的整数。
        public static int halfSearch(int [] arr,int key)
        {
                //数组最小角标min=0,最大角标max=arr.length-1;中间角标mid=(min+max)/2
                int min        =0,max = arr.length-1;
                int mid=(min+max)/2;
                //设置循环
                while (key !=arr[mid])
                {
                        //key比中间数大
                        if(key>arr[mid])
                                min=mid+1;
                        //key比中间数小
                        else if(key<mid)
                                mid=max-1;
                        //再次折半
                        mid=(min+max)>>1;
                        //如果最小角标超过最大角标,说明数组中没有这个数
                        if(min>max)
                                return -1;
                }
                return mid;                       
               
        }
        //halfSearch的第二种做法
        public static int halfSearch_2(int [] arr,int key)
        {
                int min=0,mid;
                int max=arr.length-1;
                //当满足折半条件时
                while (min<=max)
                {
                        mid=(min+max)>>1;
                        if (key>arr[mid])
                        {
                                min=mid+1;
                        }
                        else if (key<arr[mid])
                        {
                                max=mid-1;
                        }
                        else
                                return mid;
                }
                //如果循环停了还没有找到,就说明没有
                return -1;
        }


        //遍历数组 display
        public static void display(int[] arr )
        {
                System.out.print("数组中的元素是:\n{ ");
                for (int x=0;x<arr.length ;x++ )
                {
                        if(x!=arr.length-1)
                        {
                                System.out.print("["+x+"]="+(arr [x])+" ,");
                        }
                        else
                        {
                                System.out.println("["+x+"]="+(arr [x])+" }\n");
                        }
                }
        }
        //根据返回值,判断输出角标还是没有这个数
        public static void display(int x)
        {
                if (x<0)
                {
                        System.out.println("数组中没有这个数!");
                }
                else       
                        System.out.println("数组中有这个数,角标为: "+x);

        }

}






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