Java数据结构学习笔记——16二分查找

二分查找

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是:(这里假设数组元素呈升序排列)将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止;如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x;如果x>a[n/2],则我们只要在数组a的右 半部继续搜索x。

代码实现:

import java.util.ArrayList;
import java.util.List;

public class BinarySearch {

	public static void main(String[] args) {
		int[] array = {1,8,10,89,100,100,100};
		List l = search(array,0,array.length-1,100);
		System.out.println(l.toString());
	}

	public static ArrayList<Integer> search(int[] array,int left,int right,int findvalue){
		if(left>right){
			return new ArrayList<Integer>();
		}
		int mid = (left + right)/2;//将数据二等分
		if(findvalue<array[mid]){//判断在中间值那一边,并对那边进行再次二分判断
			return search(array,left,mid-1,findvalue);
		}else if(findvalue>array[mid]){
			return search(array,mid +1,right,findvalue);
		}else{//找到该值后向左和右分别查看是否还有相同数字,并放入链表中返回
			ArrayList<Integer> a = new ArrayList();
			int temp = mid -1;
			while(true){
				if(temp<0 || array[temp]<findvalue)
					break;
				a.add(temp);
				temp = temp-1;
			}
			temp = mid +1;
			while(true){
				if(temp>array.length-1 || array[temp]>findvalue)
					break;
				a.add(temp);
				temp = temp+1;
			}
			a.add(mid);
			return a;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值