代码实现
public class BinarySearchTest {
public static void main(String[] args) {
int[] arr = new int[]{0,1,2,3,4,5,6,7,8,9,10};
System.out.println(binarySearch(arr, 3));
}
/**
* 二分查找算法
* @Param arr 有序数组
* @Param data 查找的数据
* @return index 下标,为查找到是,返回 -1
*/
public static int binarySearch(int[] arr, int data) {
int low = 0; // 低位下标
int height = arr.length - 1; // 数组的长度,坐标从0开始。
while (low <= height) {
int mid = low + (height - low) / 2; // 中间下标
if (arr[mid] < data) {
low = mid + 1; // 中间下标+1,二分查找区域
} else if (arr[mid] == data) {
return mid;
} else {
height = mid - 1;
}
}
return -1;
}
}
二叉搜索树-时间复杂度分析:
1.二分查找算法
[0,1,2,3,4,5,6,7,8,9]
暴力算法:运气好时,性能不错,运气不好时,性能暴跌…
二分查找算法:数据源必须是有序数组,性能非常不错,每次迭代查询可以排除一半的结果。
2.二分查找算法最大的缺陷是什么?
强制依赖->有序数组,性能才能不错。
注意:链表不适用。
3.数组有什么缺陷?
数组和链表的区别。
4.怎么能拥有二分查找的高性能,又能拥有链表一样的灵活空间?
二叉搜索树。
5.二分查找算法时间复杂度推算过程
第几次查询 | 剩余待查询元素数量 |
---|---|
1 | N/2 |
2 | N/(2^2) |
3 | N/(2^3) |
4 | K/(2^K) |