二分查找(折半查找)

464 阅读1分钟

d3d8acfae2b2a210cc4821fc6c36cbcd.gif

一、定义

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

三、 总结

会当凌绝顶,一览众山小。

时间匆忙,递归的代码实现将会在之后的迭代中补充。

才疏学浅,拙文一篇欢迎雅正。