面试必备算法——二分查找(Java&Python3)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vivizhangyan/article/details/81736362

对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。

给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。

测试样例:
[1,3,5,7,9],5,3
返回:1
Java实现代码:

import java.util.*;

public class BinarySearch {
    public static int getPos(int[] A, int n, int val) {
        // 就是为了覆盖重复元素的出现的情况
        int high = n - 1, low = 0, mid = 0, flag = -1;
        // 如果最低位小于等于最高位一直循环
        while (low <= high) {
            mid = (high + low) / 2;
            // 如果中间值等于给定值就把这个位置给flag
            if (A[mid] == val) {
                flag = mid;
            }
            // 如果中间值大于等于给定值,指针的最高位移动,之所以这里要用等于,
            // 就是因为此处会存在最低位出现重复元素的情况,比如4,4,10,21
            // mid第一次指向第二个4,但是第二个4并不是答案,所以high还需要移动,
            // 这样原先的flag的值就会被覆写。
            if (A[mid] >= val) {
                high = mid - 1;
            }
            // 如果中间值小于给定值,最低位移动,此处是不可以用等号的,此处如果用等号
            // 就会导致第一个重复元素的下标为奇数(下标从0开始)的循环条件 low>high,
            // 最终结果错误。
            if (A[mid] < val) {
                low = mid + 1;
            }
        }
        // 此处直接返回flag即可,不用做判断,如果数组中没有给定值,flag还是初始值-1;
        // 如果有给定值,flag进行了重新赋值,所以无需判断。
        return flag;
    }
}

Python3实现代码:

print("有序数组中的二分查找")
key=int(input("请输入您要查找的整数:"))
c=[11,12,17,10,19,21,22,24,32,38,49,51,66,78,90]
def BinarySearch(key,c):
    lo,hi= 0,len(c)-1
    while lo<=hi:
        #mid = int(lo+(hi-lo)/2)
        mid = int((lo+hi)/2)
        if key<=c[mid]:
            hi = mid-1
        elif key>=c[mid]:
            lo = mid+1
        else:
            return print("%s在数组中的索引为%s"%(key,mid))
    return print("%s不在该数组中"%key)

BinarySearch(key,c)

猜你喜欢

转载自blog.csdn.net/vivizhangyan/article/details/81736362