排序和搜索(二)——python实现二分查找

 
【基本原理】
在上一篇有序列表的顺序查找中,我们假定列表是按照值排好序的,基于排序的列表,我们按照python列表索引从头开始比较。
而在二分查找中,我们先取中间索引位置,如果找到就返回;没找到(升序排序),如果中间位置的值大于待查项,则排除中
间位置的值和比中间位置值大的另一半元素,如果待查项在列表中,肯定存在于小的半部分。重复此过程知道找到,返回
反过来也一样
【二分查找分析】

列表有n项,第1次比较剩n/2,第2次比较剩n/4,第3次比较剩n/8,......,第i次比较剩n/2^i,最后剩一项,要么是,要么不是,故n/2^i=1,i=以2为底n的对数。因此二分查找是O(log^n)。需注意排序和查找的花销均衡

【代码】
#实现二分查找
def binarySearchBasic(alist,item):
    first=0
    last=len(alist)-1
    post=(first+last)//2
    found=False
    while not found and first<=last:
        if alist[post]==item:
            found=True
            print('找到了,位置在',post+1)
        elif alist[post]<item:
            first=post+1
        else:
            last=post-1
        post = (first + last) //2
    return found
print(binarySearchBasic([1,3,5,7,9,12,45,89,91,95,96,98],12))

#递归实现二分查找
def binarySearchByRec(alist,item):
    if len(alist)==0:
        return False
    else:
        post=len(alist)//2
        # print(post)
        if alist[post]==item:
             return True
        elif alist[post]<item:
            return binarySearchByRec(alist[post+1:], item)
        else:
            return binarySearchByRec(alist[:post], item)

print(binarySearchByRec([1,3,5,7,9,12,45,89,91,95,96,98],12))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以为你提供一个Python实现二分查找的示例代码:def binary_search(array, target): n = len(array) left = 0 right = n - 1 while left <= right: mid = (left + right) // 2 if array[mid] == target: return mid elif array[mid] < target: left = mid + 1 else: right = mid - 1 return -1 ### 回答2: 二分查找是一种高效的查找算法,可以用来在有序数组中快速找出特定元素的位置。下面是用Python实现二分查找的代码: ```python def binary_search(arr, target): low = 0 high = len(arr) - 1 while low <= high: mid = (low + high) // 2 if arr[mid] == target: return mid elif arr[mid] < target: low = mid + 1 else: high = mid - 1 return -1 ``` 这段代码首先初始化了low和high两个变量,它们分别表示数组的起始和结束位置。然后,利用一个while循环来在数组中查找目标元素。 在循环中,首先计算出当前的中间位置mid。然后,判断mid位置的元素与目标元素的大小关系。 - 如果mid位置的元素等于目标元素,说明找到了目标,直接返回mid。 - 如果mid位置的元素小于目标元素,说明目标元素在mid右侧,将low更新为mid+1。 - 如果mid位置的元素大于目标元素,说明目标元素在mid左侧,将high更新为mid-1。 如果循环结束后仍然没有找到目标元素,说明目标元素不存在于数组中,返回-1。 这就是用Python实现二分查找的基本过程。二分查找的时间复杂度为O(log n),比线性查找更加高效。 ### 回答3: 二分查找(Binary Search)是一种高效的搜索算法,用于在有序数组中查找目标元素。以下是使用Python实现二分查找的示例代码: ```python def binary_search(arr, target): left = 0 right = len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 arr = [2, 4, 6, 8, 10, 12, 14, 16] target = 10 result = binary_search(arr, target) if result != -1: print("目标元素在数组中的索引为:", result) else: print("目标元素不在数组中") ``` 以上代码实现了`binary_search`函数,该函数接受一个有序数组`arr`和目标元素`target`作为输入,返回目标元素在数组中的索引。若目标元素不在数组中,则返回-1。函数内部使用`left`和`right`两个指针来确定每次查找的区间范围,通过不断缩小区间来逐步逼近目标元素。最后,根据返回的结果判断目标元素是否在数组中,并输出相应结果。 在以上示例中,`arr`为有序数组`[2, 4, 6, 8, 10, 12, 14, 16]`,`target`为10。根据二分查找算法,函数返回的结果为4,即10在数组中的索引位置。最后,输出结果为"目标元素在数组中的索引为: 4"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值