折半查找与优化

来源:互联网 发布:linux搭建邮件服务器 编辑:程序博客网 时间:2024/05/21 13:21
public class Arraydemo5 {    public static void main(String[] args) {        // TODO Auto-generated method stub        int[] arr = {17,34,89,131,502,667};        System.out.println("arr.length="+arr.length);        printArray(arr);        System.out.println(getIndex_3(arr,11,0,arr.length-1));    }    public static void printArray(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 int getIndex(int[] arr,int key) {        for(int x=0; x<arr.length; x++)            if(arr[x] == key)                return x;        return -1;//这句不能没有 因为已经定义了返回值类型int 上一句的return是被控制的 如果没有找到值 则没有返回 这不符合已定义的返回值类型int 所以要加一句    }    public static int getIndex_2(int[] arr,int key,int min,int max) {        /*         有序数组         首先 取arr.length+0/2 if(arr[mid]==key) return mid;         else          */        int mid = (max + min) / 2;        while(arr[mid] != key && max > min){            if(arr[mid] > key){                             max = mid-1;                                mid = (min + max) / 2;                  }                                           else{                                           min = mid+1;                                mid = (min + max) / 2;            }        }        if(max < min)            return -1;        return mid;    }// 可以发现mid=(min+max)/2做了两次 可以优化//  if(arr[mid]>key)    max=mid-1;//  else min=mid+1;//  if(max<min) return -1;//  mid放到条件判断语句之后又是一个小小的优化  //  mid=(min+max)/2; 见3//  下方的4更清晰     public static int getIndex_4(int[] arr,int key,int min,int max){        while(min<=max){            int mid = (max + min)>>1;            if(arr[mid]>key)    max=mid-1;            else if(arr[mid]<key)   min=mid+1;            else return mid;        }    return -1;    }    public static int getIndex_3(int[] arr,int key,int min,int max){        int mid = (max + min)>>1;        while(arr[mid]!=key){            if(arr[mid]>key)    max=mid-1;            else min=mid+1;            if(max<min) return -1;            mid=(min+max)/2;        }    return mid;    }}