《算法图解》记录1

8 篇文章 0 订阅
1 篇文章 0 订阅

二分法查找有序序列中(列表),某元素的索引

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 二分法查找有序序列中(列表),某元素的索引


def get_idx(list, item):
    start = 0
    end = len(list) - 1

    while start <= end:
        mid = int((start + end) / 2)  # 如果是小数,向下取整,python2 默认向下取整
        guess = list[mid]
        if guess == item:
            return mid
        if guess > item:  # 猜的数字大了
            end = mid - 1
        else:
            start = mid + 1
    return None


li1 = [0, 1, 2, 3, 4]
print( get_idx(li1, 7))
print( get_idx(li1, 2))

注意:
  在python 2.x中/除法就跟我们熟悉的大多数语言,比如Java啊C啊差不多,整数相除的结果是一个整数,把小数部分完全忽略掉(向下取整),浮点数除法会保留小数点的部分得到一个浮点数的结果。
在python 3.x中/除法不再这么做了,对于整数之间的相除,结果也会是浮点数。

  如果列表中包含8个元素,使用二分法最多需要检查3个元素(最多需要3步),因为 log28 =3 (23=8 )。如果列表包含1024个元素,你最多需要检查10个元素(最多需要10步),因为 log21024 =10 (210=1024 )。

练习:
1.1 假设有一个包含128个名字的有序列表,你要使用二分法在其中查找一个名字,请问最多需要几步才能找到?
1.2上面列表长度翻倍后,最多需要几步?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值