首先要明白,二分查找是建立在有序数组的基础上的。
二分查找主要有递归和非递归两种算法实现
/**
* 二分查找的递归和非递归实现
*
* @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}
查找成功时的平均查找长度
首先根据二分查找的算法,将有序数组转换成二叉树搜索树的形式,然后每一层的数据的个数乘以所在层数后累加,最后除以数据数即可。
查找失败时的平均查找长度
而对于查找失败的平均查找长度来说,需要为所有的结点补充左右子结点。然后计算各层子结点数与层数乘积后的累加和,最后除以补充的子结点数即可。