一、二分查找算法思想
又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。
二、图示说明
三、二分查找优缺点
优点是比较次数少,查找速度快,平均性能好;
其缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
使用条件:查找序列是顺序结构,有序。
四、代码实现
1.非递归方法
private static int binarySearch(int[] arr, int key) {
int left = 0;
int right = arr.length-1;
int mid ;
if (key < arr[left] || key > arr[right] || left > right){
return -1;
}
while(left < right){
mid = (left + right)/2;
if (arr[mid] < key){
left = mid +1;
}else if(arr[mid] > key){
right = mid - 1;
}else {
return mid ;
}
}
return -1;
}
2.递归方法
public static int binarySearch(int[] arr,int left,int right,int key){
if (key < arr[left] || key > arr[right] || left > right){
return -1;
}
int mid = (left+right)/2;
if (arr[mid]<key){
return binarySearch(arr,mid+1,right,key);
}else if(arr[mid]>key){
return binarySearch(arr,left,mid-1,key);
}else {
return mid;
}
}
五、时间复杂度和空间复杂度
时间复杂度
采用的是分治策略
最坏的情况下两种方式时间复杂度一样:O(log2 N)
最好情况下为O(1)
空间复杂度
算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数
非递归方式:由于辅助空间是常数级别的,所以空间复杂度是O(1);
递归方式: 递归的次数和深度都是log2 N,每次所需要的辅助空间都是常数级别的:
空间复杂度:O(log2N )
来源:CSDN
作者:青春年少不知疼
链接:https://blog.csdn.net/dc282614966/article/details/103820851