二分查找的java实现以及平均查找长度

首先要明白,二分查找是建立在有序数组的基础上的。

二分查找主要有递归和非递归两种算法实现

/**
 * 二分查找的递归和非递归实现
 * 
 * @author ht
 *
 */
public class BinarySearch {
	public static void main(String[] args) {
		Arr a = new Arr(10);
		a.addNum(1);
		a.addNum(3);
		a.addNum(6);
		a.addNum(7);
		a.addNum(9);
		a.addNum(10);
		a.addNum(13);
		a.addNum(15);
		a.addNum(16);
		a.addNum(18);
		a.addNum(20);
		System.out.println(a.searchNum(16));// 递归
		System.out.println(a.search(a.arr, a.arr.length, 13));// 非递归
	}
}

class Arr {
	int[] arr;
	int size;
	int index;
	int low;
	int mid;
	int high;

	public Arr(int size) {
		this.size = size;
		arr = new int[size];
		index = 0;
		low = 0;
		high = size - 1;
		mid = (low + high) / 2;
	}

	public void addNum(int num) {
		if (index < size) {
			arr[index++] = num;
		}
	}

	// 递归算法
	public int searchNum(int num) {
		if (high < low) {
			System.out.println("查找的数不存在!");
			return -1;
		}
		if (arr[mid] == num) {
			// return mid;//返回下标
			return num;// 返回值
		} else if (arr[mid] > num) {
			high = mid - 1;
			mid = (low + high) / 2;
			return searchNum(num);
		} else if (arr[mid] < num) {
			low = mid + 1;
			mid = (low + high) / 2;
			return searchNum(num);
		}
		return -1;
	}

	// 非递归
	public int search(int arr[], int n, int key) {
		int low = 0, high = n - 1;
		int mid;
		while (low <= high) {
			mid = (low + high) / 2;
			if (arr[mid] == key)
				// return mid;//返回下标
				return arr[mid];// 返回值
			if (arr[mid] < key)
				low = mid + 1;
			else
				high = mid - 1;
		}
		return -1;
	}
}

二分查找的平均查找长度分为两种情况,一种是成功查找到时的平均查找长度,一种是查找失败时的平均查找长度。

实例分析

数据:长度为9的有序数组{1,3,5,6,9,12,18,25,26}

查找成功时的平均查找长度

首先根据二分查找的算法,将有序数组转换成二叉树搜索树的形式,然后每一层的数据的个数乘以所在层数后累加,最后除以数据数即可。

查找失败时的平均查找长度

而对于查找失败的平均查找长度来说,需要为所有的结点补充左右子结点。然后计算各层子结点数与层数乘积后的累加和,最后除以补充的子结点数即可。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值