JAVA实现二分法查找算法

现实生活中经常会遇到将具有某个特征的元素选择出来,并找出对应的位置。

现在来一个小测验,在以数组【1,4,8,3,0,7,56】中找到8所在的位置,很明显大家可以通过直观的感受就可以找到8处于位置3上。

现在换一组数据,【2,6,9,....,3,78,34】,总共有3000个元素,要求找到3这个元素处在的位置,可见从只管感受上不能选择出来。那么有没有更好的办法解决这个问题呢?

针对这个问题,二分法查找算法就能够很好的解决这个问题。接下来先了解二分法原理

二分法原理:
        1. 设置查找区间:low = 0;high= n(n是查找数组的长度);
        2. 若查找区间[low, high]不存在,则查找失败;否则转步骤3
        3. 取中间位m= (low + high) / 2;比较 target 与 array[mid](其中target是目标,array是数组),有以下三种情况:
                A. 若 target < array[m],则high = m - 1;查找在左半区间进行,转步骤2;
                B. 若 target > array[m],则low = m + 1;查找在右半区间进行,转步骤2;
                C. 若 target = array[m],则查找成功,返回 m值;
这里要注意,二分法查找的线性表中的元素必须是有序的。

总的来说,二分法查找是一种区间折半逼近的方法,通过取中间点判断目标值是否在中间点的前面还是后面或者中间,进而缩小范围。

当确定在前半部分或者后部分之后,在对前或后半部分再一次取中间点,依次下去,直到找到目标值。

可以说,二分法的原理具有简单高效的效果。

下面给出以java编写的二分法查找算法的实现代码:

package algorithm;
// 实现二分法查找算法
public class Two_Find_algorithm {
	public static void main(String[] args) {
		//创建一个数组
		int [] array={1,5,9,15,36,39,41,42,49,50,58};
		int targe=49;
		int index=FindBary(array,targe);
		//打印结果
		//System.out.println(array);
		System.out.println("目标值所在位置索引为:"+index);
	}
	
	//构造FindBary方法
	public  static int FindBary(int [] a,int t) {
		//获取边界
		int l=0,r=a.length,m;
		while(l<=r) {
			m=(l+r)/2;
			if(a[m]==t){
				return m;
			}else if(a[m]>t){
				r=m-1;
			}else {
				l=m+1;
			}
		}
		return -1;
	}
}

显示结果:

目标值所在位置索引为:8

matlab:一种有效的差分进化算法解决多目标优化问题(简称MODEA)

你可能感兴趣的:(java基础学习及编程,算法,数据结构,二分法查找,java)