您的位置:首页 > 职场人生

《黑马程序员》折半查找法实现及测试练习

2014-04-06 18:55 204 查看
------- android培训java培训、期待与您交流! ----------
/**
* 折半查找算法
*   先写一个方法查找指定的key在数组中的位置
*   然后写折半查找的两种方法
*     用于折半查找的数组必须要是有序的
*
*     在数组中插入一个元素,还要保证数组是有序的
*/
public static void main(String[] args) {
int [] arr={8,17,20,32,115};
int retKey=getKey(arr, 32);
System.out.println("获取的key在数组中的位置:"+retKey);
int halfKey_1=halfSearch_1(arr, 32);
System.out.println("二分查找的结果:"+halfKey_1);

int halfKey_2=halfSearch_2(arr,20);
System.out.println("二分查找的结果:"+halfKey_2);

//在数组中插入元素,还要保证数组是有序的
//我们可以通过折半查找来获取到该元素应该插入在数组中的哪个位置
System.out.println("元素应插入在:"+getInsetE_index(arr, 10)+"角标位");
}

//第三种查找方式:
public static int getInsetE_index(int [] arr,int key){
int min,max=arr.length-1,mid;
min=0;  //初始的最小角标
while(min<=max){
//最小角标<=最大角标的时候才进行折半查找
mid=(min+max)>>1; //>>位置运行,右移1位即是/2,效率还高一些
if(key>arr[mid]){
min=mid+1;
}else if(key<arr[mid]){
max=mid-1;
}else
return mid; //说明已经找到
}
return min;  //返回最小值
}

//第二种查找方式:
public static int halfSearch_2(int [] arr,int key){
int min,max=arr.length-1,mid;
min=0;  //初始的最小角标
while(min<=max){
//最小角标<=最大角标的时候才进行折半查找
mid=(min+max)>>1; //>>位置运行,右移1位即是/2,效率还高一些
if(key>arr[mid]){
min=mid+1;
}else if(key<arr[mid]){
max=mid-1;
}else
return mid; //说明已经找到
}
return -1;  //没有找到
}

//第一种查找方式:
//如果key不是中间角标上的元素就一直进行折半查找。
public static int halfSearch_1(int [] arr,int key){
//三个变量:最小角标,最大角标,中间值的角标
int min,max=arr.length-1,mid;
//初始化最小值 的角标为0
min=0;
mid=(min+max)/2;   //中间值的计算方式
while(key!=arr[mid]){  //key==arr[mid]  循环就结束了就代表找到了
//如果中间值不等于key那就说明没有找到就要一直找下去
if(key>arr[mid]){
//如果传入的key大于中间值角标上的元素
//就要在中间角标的右边进行折半查找
min=mid+1;  //最小角标=中间角标+1
}else if(key<arr[mid]){
//如果传入的key小球中间值角标上的元素
//就要在中间角标的左边进行折半查找
max=mid-1;  //最大角标左移,最大角标=中间角标-1
}
//上面的判断只是在判断key在不同的情况下,最小角标和最大角标的移动变化。
mid=(min+max)/2;  //继续让它折半查找
}
//如果不等于那就是等于了,直接返回中间值
return mid;
}

//先做查找一个指定的key在数组中的位置
public static int getKey(int[] arr,int key){
for (int i = 0; i < arr.length; i++) {
if(arr[i]==key){
return i;  //找到了就返回这个元素的索引
}
}
return -1; //如果没有找到就返回-1
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息