一、定义
1.1前提
二分法查找适用于数据量较大时,但是数据需要先排好顺序。
1.2主要思想
确定该区间的中间位置mid将查找的值value与数组中间位置的值比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:array[mid]>value 由数组的有序性可知array[mid,mid+1,……,high]>value;故新的区间为array[low,……,mid-1],array[mid]<value 类似上面查找区间为array[mid+1,……,high]。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间将缩小一半,直到查找区间内没有值。
二、代码实现
2.1 java-非递归
import java.util.Arrays;
public class Test08 {
public static void main(String[] args) {
int[] arr = {30,20,50,10,80,9,7,12,100,40,8};
int searchWord = 20;
System.out.println("搜索的目标值索引为:"+binarySearch(arr,searchWord));
}
/**
* 二分法查找
* @param array 查找的数组
* @param value 要查找的值
* @return 若查找到,则返回这个值在数组中的索引: 若没有找到,则返回-1
*/
public static int binarySearch(int[] array, int value){
if (array.length==0){
return -1; //若传入数组长度为0,直接返回-1说明未找到
}
int low = 0;
int high = array.length-1;
Arrays.sort(array); //对传进来的数组排序,二分查找只能用于有序列表
System.out.println(Arrays.toString(array));;
while(low<=high){ //结束时查找区间为[high,low]为空 eg.[5,4]
int middle = (low+high)/2; //取中间值
if (value==array[middle]){
return middle; //查询到该值,返回对应的索引位置
}
if (value>array[middle]){
low = middle+1; //查找区间是[low,high],+1使middle被去除
}
if (value<array[middle]){
high = middle-1; //查找区间是[low,high],-1使middle被去除
}
}
return -1; //若循环结束前没有return说明未找到,返回-1
}
}
2.2 python-非递归
def binary_search(array,value):
if len(array) == 0:
return False #若传入数组长度为0,直接返回False说明未找到
array.sort() #对传进来的数组排序,二分查找只能用于有序列表
[print(f'{ar} ',end="") for ar in array]
start, end = 0, len(array)-1
while start<=end: #结束时查找区间为[start,end]为空 eg.[5,4]
mid_index = (int)((start+end)/2)
if array[mid_index] == value:
return mid_index #查询到该值,返回对应的索引位置
if array[mid_index] > value:
end = mid_index-1 #查找区间是[low,high],-1使middle被去除
if array[mid_index] < value:
start = mid_index+1 #查找区间是[low,high],+1使middle被去除
return False #若循环结束前没有return说明未找到,返回False
if __name__ == '__main__':
arr = [30, 20, 50, 10, 80, 9, 7, 12, 100, 40, 8]
searchWord = 20
print(f"搜索的目标值索引为:{binary_search(arr, searchWord)}")
2.3 java-递归
pass
2.4 python-递归
pass
三、 总结
会当凌绝顶,一览众山小。
时间匆忙,递归的代码实现将会在之后的迭代中补充。
才疏学浅,拙文一篇欢迎雅正。