折半查找

本文介绍了折半查找的基本原理,包括其递归与循环两种实现方式,并详细解释了判定树的概念及折半查找的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【折半查找思路】折半查找首先需要要查找的序列是有序的(下面的讨论基于递增有序)。假设Array[start , ... , end]为当前的查找区间,首先确定该区间的中间位置,即mid = (start + end) / 2;然后将待查找的k值与Array[mid]做比较,此时有三种情况:第一,若k = Array[mid]。则查找成功,返回mid即为查找到的位置;第二,若k > Array[mid]。则说明k值在Array序列的右半边,此时的查找序列将变为Array[mid+1, ... , end];第三,若k < Array[mid]。则说明k值在Array序列的左半边,此时的查找序列将变为Array[start, ... , mid-1]。不断地递归进行下去,直到区间的长度小于1时查找结束。

【折半查找的Java实现】

public class BinaryFind {

	public BinaryFind() {
		// TODO Auto-generated constructor stub
	}
	
	public int binary_find_1(int array[],int start,int end,int k){    //折半查找的递归实现
		int find_index = -1;    //初始查找位置为-1,即代表查找失败
		if (start <= end) {    //如果区间长度大于等于1
			int mid_index = (start + end)/2;    //首先确定区间的中间位置
			if (array[mid_index] == k) {    //将要查找的k值与区间中间位置值进行比较
				return mid_index;    //k值与区间中间位置值相等,返回中间位置下标,查找成功
			}else if(k > array[mid_index]){    //k值比中间位置值大,在右半边继续递归查找
				return binary_find_1(array,mid_index+1,end,k);
			}else {    //k值比中间位置值小,在左半边继续递归查找
				return binary_find_1(array,start,mid_index-1,k);
			}
		}
		return find_index;
	}
	
	public int binary_find_2(int array[],int start,int end,int k){    //折半查找的循环实现
		int find_index = -1;
		while (start <= end) {
			int mid_index = (start + end)/2;
			if (array[mid_index] == k) {
				return mid_index;
			}else if(k > array[mid_index]){
				start = mid_index + 1;
			}else {
				end = mid_index - 1;
			}
		}
		return find_index;
	}
	
	public static void main(String[] args) {
		int[] array = {1,2,3,4,5,6,7,8,9,10};
		BinaryFind binaryFind = new BinaryFind();
		System.out.println(""+binaryFind.binary_find_2(array,0,9,5));
	}

}

【判定树】折半查找的过程可以用一棵二叉树来表示。把当前查找区间中的中间位置上的记录作为树根,左子表和右子表中的记录分别作为根的左子树和右子树,由此得到的二叉树称为描述折半查找的判定树。对于一个有序表所建立的折半查找判定树的树形与原始序列的关键字值无关,只与原始序列中关键字的个数有关,即关键字个数相同的有序表可以产生同形的判定树。

【复杂度与查找长度】对于有n个记录的查找便进行折半查找的时间复杂度为O(logn),平均查找长度近似为log(n+1)-1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值