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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 汪显晟 初级黑马   /  2013-9-20 21:20  /  1387 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 EYE_SEE_YOU 于 2013-9-21 18:56 编辑

class SelectArray {
        public static void main(String[] args) {
                int[] arr = {33,22,11,66,55,44};                        //无序数组
                //System.out.println(getIndex(arr,88));
                int[] arr2 = {11,22,33,44,55,66,77};
                System.out.println(getIndex3(arr2,88));
        }
        //无序的数组查找
        public static int getIndex(int[] arr,int key) {
                for (int x = 0;x < arr.length; x++ ) {
                        if (key == arr[x]) {
                                return x;
                        }
                }
                return -1;
        }
        //有序的数组二分查找
        public static int getIndex2(int[] arr,int key) {
                int min = 0;                                               //定义变量记录最小角标值
                int max = arr.length - 1;                              //定义变量记录最大角标值
                int mid = (min + max) / 2;                     //求出中间角标值

                while (key != arr[mid]) {                            //当查找的值不等于中间角标值,开始循环
                        if (key < arr[mid]) {                              //传入的值小于了中间角标值
                                max = mid - 1;                              //最大角标变化
                        }else if (key > arr[mid]) {                //传入的值大于了中间角标值
                                min = mid + 1;                           //最小角标变化
                        }
                        mid = (min + max) / 2;                //无论min还是max改变,中间角标值都要随之改变
                        if (min > max) {                        //当最小角标值大于了最大角标值,就没有折半的可能了,返回-1
                                return -1;
                        }
                }

                return mid;
        }

        //二分查找法的第二种做法
        public static int getIndex3(int[] arr,int key) {
                int min = 0;                                       //定义变量记录住最小的角标值
                int max = arr.length - 1;                       //定义变量记录住最大角标值
                while (min <= max) {                           //如果最小的角标值小于最大角标值就可以进行折半了
                        int mid = (min + max)/2;              //求出中间角标值
                        if (key < arr[mid]) {                        //判断传入的值如果小于中间角标值
                                max = mid - 1;                      //最大角标值变化
                        }else if (key > arr[mid]) {            //如果传入的值大于了中间角标值
                                min = mid + 1;                             //最小角标值变化
                        }else {                                       
                                return mid;
                        }
                }

                return -1;                                         //没有折半的可能直接返回-1
        }
}


1 个回复

倒序浏览
既然不是未解决的问题,应该设置其他分类
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马