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

------- 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
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值