20200227java学习之路之数组的二分查找法

一:数组二分查找法

  1. 二分查找法又被称为折半查找,是一种效率较高的查找方法
  2. 二分查找法的原理:将数组分为三部分,中值(最中间的值),中值前,中值后,将要查找的值和数组的中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回。

二分查找法的实例一

/*
需求一:运用二分查找法查找出在数组中{13,15,20,33,54,69,98,110};是否存在54这个数值?
思路:1)先遍历一遍数组中的数据
      2)利用角标便于记录数据的位置
      3)将数组分为三个部分,中值(mid),中值前(min),中值后(max)
      4)先用中值与要查找的那个数先进行比较,确定其位置。小于中值在前面找,反之则后面找。一次类推
      5)需进行比较哟啊用到if语句
*/
public class TestArrayDemo{
	public static void main(String[] args){
		//int [] arr={45,5,6,23,33,56,22};
		int [] arr={13,15,20,33,54,69,98,110};
		//int index=getIndex(arr,33);
		//int index=halfSearch(arr,60);
		int index=halfSearch2(arr,54);
		System.out.println("index="+index);
	}

	public static int getIndex(int [] arr,int key){
		for (int x=0;x<arr.length;x++){
			if(arr[x]==key)
			return x;
		}
			return -1;//返回值为-1时就是不需要返回,退出程序
	}

	public static int halfSearch(int [] arr,int key){
		int max=arr.length-1;
		int min=0;
		int mid=(max+min)/2;

		while(arr[mid]!=key){
			if (key>arr[mid])
				min=mid+1;
			else if(key<arr[mid])
				max=mid-1;
			if(max<mid)
				return -1;


				mid=(max+min)/2;
			
		}
		return mid;
	}


	public static int halfSearch2(int [] arr,int key){
		int max=arr.length-1;
		int min=0;
		int mid=(max+min)/2;

		while(min<=max){
				mid=(min+max)>>1;//除以2
		if(key>arr[mid])
				min=mid+1;
		else if(key<arr[mid])
			max=mid-1;
		else
			return mid;
			
		}
		return -1;//返回值为-1时就是不需要返回,退出程序
	}


}

运行结果:在第五个位置找到数据
在这里插入图片描述

二分查找法的实例二

/*需求一:运用下标查找出在数组中{13,15,20,33,54,69,98,110};70大概在哪个位置其角标为?
思路:1)将数组分为三个部分,中值(mid),中值前(min),中值后(max)
      2)先用中值与要查找的那个数先进行比较,确定其位置。小于中值在前面找,反之则后面找。一次类推
      3)需进行比较哟啊用到if语句

*/
import java.util.*;
public class TestHalfSearch{
	public static void main(String[] args){

		int [] arr={13,15,20,33,54,69,98,110};
		int index=halfSearch2(arr,70);
		System.out.println("index="+index);
		//int index1=Arrays.binarySearch(arr,54);//这是系统内有的语言可以直接运用查找位置
		//System.out.println("index="+index);//输出结果与此编码出来的结果一致
	}


	public static int halfSearch2(int [] arr,int key){
		int max=arr.length-1;
		int min=0;
		int mid=(max+min)/2;

		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 class TestArrayWeek{
	public static void main(String[] args){
		String week=getWeek(71);
		System.out.println(week);

	}
	public static String getWeek(int num){
		if(num>7 || num<1){
			return "错误的星期"}
		string [] weeks={"","星期一""星期二""星期三""星期四""星期五""星期六""星期日"}return weeks[num];
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值