二分查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。
查找过程
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
算法时间复杂度:O(h)=O(log2n)
/**
* 二分查找(Ts)
* @param tab:升序的number数组,假设是数据类型是number
* @param key 查找的值
* @return number 索引;
*/
public static binarySearch(tab: number[], key: number) {
let right: number = tab.length - 1;//开始右边解
let left: number = 0;//开始左边界
//二分法是折半查找的,当查找的左边界<=右边界是,循环结束
while (left <= right) {
let mid = Math.ceil((right + left) / 2);//判断的值,对半开始
if (tab[mid] == key)//如果查找值相等,
return mid;//返回对应的key
else if (tab[mid] < key) {//判定在区间(mid,right]
left = mid + 1;
} else {//判定在区间[left,mid)
right = mid - 1;
}
}
//没有这个key
return -1;
}
二分查找递归实现
/**二分查找递归实现 */
function binary(find, arr, low, high) {
if (low <= high) {
if (arr[low] == find) {
return low;
}
if (arr[high] == find) {
return high;
}
let mid = Math.ceil((high + low) / 2);
if (arr[mid] == find) {
return mid;
} else if (arr[mid] > find) {
return binary(find, arr, low, mid - 1);
} else {
return binary(find, arr, mid + 1, high);
}
}
return -1;
}