二分查找法

二分搜索是一种在有序数组中查找某一特定元素的搜索算法。
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

使用条件:
1、必须采用顺序存储结构。
2、必须按关键字大小有序排列。

二分查找,非递归(Java)

public static void main(String[] args) {
        int[] num={1,2,3,3,4,5,7,8,11,18,22,22};
        int n=5;
        int index=-1;

        int left=0;
        int right=num.length-1;
        int mid=(left+right)/2;
        while(left<=right) {
            if(num[mid]==n) {
                index=mid;
                break;
            // n大于中间元素,需要去右边找,查找范围变成 [mid+1, right]
            }else if(n>num[mid]) {
                left=mid+1;
            }else {
                right=mid-1;
            }
            mid=(left+right)/2;
        }
        if(index==-1) {
            System.out.println("你输入的数字不存在。");
        }else {
            System.out.println("数字"+n+"存在,是第"+(index+1)+"个");
        }
    }

二分查找,递归(Java)

package com.guo;
public class Test {
    public static void main(String[] args) {
        int[] num={1,2,3,3,4,5,7,8,11,18,22,22};
        int n=5;
        int index=binarySearch(num,0,num.length-1, n);
        if(index==-1) {
            System.out.println("你输入的数字不存在。");
        }else {
            System.out.println("数字"+n+"存在,是第"+(index+1)+"个");
        }

    }

    public static int binarySearch(int[] arr,int left, int right, int n) {
        if (right >= left) {
            int mid = left + (right - left) / 2;
            if (n == arr[mid]) {
                return mid;
            }
            if (n > arr[mid]) {
                return binarySearch(arr, mid + 1, right, n);
            }
            if (n < arr[mid]) {
                return binarySearch(arr, left, mid - 1, n);
            }
        }
        return -1;
    }
}

二分查找,非递归(Python)

def binarySearch(arr, n):
    left, right = 0, len(arr) - 1
    while left<=right:
        mid = int(left + (right - left) / 2)
        if n==arr[mid]:
            return mid
        elif n>arr[mid]:
            left=mid+1
        else:
            right=mid-1
    else:
        return -1

# 测试数组
arr=[1,2,3,3,4,5,7,8,11,18,22,22]
# 需要查找的元素
n=22
index = binarySearch(arr,n)
if index == -1:
    print("元素不在数组中")
else:
    print("{},在数组中的索引为:{},即第{}个".format(n, index, index+1))

二分查找,递归(Python)

# 返回 x 在 arr 中的索引,如果不存在返回 -1 
# binarySearch(列表,上限,下限,需要查找的元素)
def binarySearch(arr, left, right, x):
    # 基本判断
    if right>= left:
        mid = int(left+ (right- left) / 2)
        # 元素整好的中间位置
        if arr[mid] == x:
            return mid
        # 元素小于中间位置的元素,只需要再比较左边的元素
        elif arr[mid] > x:
            return binarySearch(arr, left, mid - 1, x)
        # 元素大于中间位置的元素,只需要再比较右边的元素
        else:
            return binarySearch(arr, mid + 1, right, x)
    else:
        # 不存在
        return -1

# 测试数组
arr = [1, 2, 3, 3, 4, 5, 7, 8, 11, 18, 22, 22]
#arr.sort()   对列表arr排序,另一种等价写法是:arr=sorted(arr)
x = 11

# 函数调用
# 上限是0,下线是长度-1。代表对列表进行全局查找
result = binarySearch(arr, 0, len(arr) - 1, x)
if result != -1:
    print("{}在数组中的索引为:{}".format(x,result))
else:
    print("元素不在数组中")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值