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

#!/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上面列表长度翻倍后,最多需要几步?

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐