陶远航 发表于 2023-4-29 10:40:01

Python中的二分查找

本帖最后由 陶远航 于 2023-4-29 10:47 编辑

Python中的二分查找(纯Python实现)
注意输入时要用英文的逗号
记得评分{:10_256:}
源码:
from __future__ import annotations
import bisect

def bisect_left(
    sorted_collection: list, item: int, lo: int = 0, hi: int = -1
) -> int:
    if hi < 0:
      hi = len(sorted_collection)

    while lo < hi:
      mid = lo + (hi - lo) // 2
      if sorted_collection < item:
            lo = mid + 1
      else:
            hi = mid

    return lo


def bisect_right(
    sorted_collection: list, item: int, lo: int = 0, hi: int = -1
) -> int:
    if hi < 0:
      hi = len(sorted_collection)

    while lo < hi:
      mid = lo + (hi - lo) // 2
      if sorted_collection <= item:
            lo = mid + 1
      else:
            hi = mid

    return lo


def insort_left(
    sorted_collection: list, item: int, lo: int = 0, hi: int = -1
) -> None:
    sorted_collection.insert(bisect_left(sorted_collection, item, lo, hi), item)


def insort_right(
    sorted_collection: list, item: int, lo: int = 0, hi: int = -1
) -> None:
    sorted_collection.insert(bisect_right(sorted_collection, item, lo, hi), item)


def binary_search(sorted_collection: list, item: int) -> int | None:
    left = 0
    right = len(sorted_collection) - 1

    while left <= right:
      midpoint = left + (right - left) // 2
      current_item = sorted_collection
      if current_item == item:
            return midpoint
      elif item < current_item:
            right = midpoint - 1
      else:
            left = midpoint + 1
    return None


def binary_search_std_lib(sorted_collection: list, item: int) -> int | None:
    index = bisect.bisect_left(sorted_collection, item)
    if index != len(sorted_collection) and sorted_collection == item:
      return index
    return None


def binary_search_by_recursion(
    sorted_collection: list, item: int, left: int, right: int
) -> int | None:
    if right < left:
      return None

    midpoint = left + (right - left) // 2

    if sorted_collection == item:
      return midpoint
    elif sorted_collection > item:
      return binary_search_by_recursion(sorted_collection, item, left, midpoint - 1)
    else:
      return binary_search_by_recursion(sorted_collection, item, midpoint + 1, right)


if __name__ == "__main__":
    user_input = input("请用逗号分隔输入数字(从小到大):").strip()
    #一定要用英文的逗号
    collection = sorted(int(item) for item in user_input.split(","))
    target = int(input("请输入要在列表中查找的单个数字:"))
    result = binary_search(collection, target)
    if result is None:
      print(f"{target} 未在 {collection} 中找到.")
    else:
      print(f"{target} 被找到在 {result} 位置在 {collection} 中.")
你没评分吧{:10_256:}
赶紧的(还有44积分就到中级鱼油了,给个荣誉也行啊,或者评个鱼币回点血)
各种排序算法:https://fishc.com.cn/thread-227638-1-1.html

陶远航 发表于 2023-4-29 10:44:53

感谢评分

歌者文明清理员 发表于 2023-4-29 10:45:57

玉璧

陶远航 发表于 2023-4-29 11:21:42

sfqxx 发表于 2023-4-29 11:37:37

sfqxx_小 发表于 2023-4-29 11:49:43

重复发帖(

陶远航 发表于 2023-4-29 12:51:58

sfqxx_小 发表于 2023-4-29 11:49
重复发帖(

已经删了

sfqxx 发表于 2023-4-29 13:29:01

陶远航 发表于 2023-4-29 12:51
已经删了

{:10_275:}

陶远航 发表于 2023-4-29 13:37:56

@不二如是 求支持

元豪 发表于 2023-4-29 14:32:54

顶~

元豪 发表于 2023-4-29 14:33:36

{:7_146:}币币~

元豪 发表于 2023-4-29 14:35:05

币币币币币币币币币币......

陶远航 发表于 2023-4-29 14:53:22

元豪 发表于 2023-4-29 14:35
币币币币币币币币币币......

中奖绝缘体...

元豪 发表于 2023-4-29 15:03:28

陶远航 发表于 2023-4-29 14:53
中奖绝缘体...

55555{:10_266:}

元豪 发表于 2023-4-29 15:04:04

中{:10_269:}

不二如是 发表于 2023-4-29 15:18:48

陶远航 发表于 2023-4-29 13:37
@不二如是 求支持

加一些解释会更好

平凡之路1314 发表于 2023-4-29 17:04:23

渔币

平凡之路1314 发表于 2023-4-29 17:05:07

再来

desc 发表于 2023-4-29 20:59:51

{:10_323:}

long90 发表于 2023-5-1 13:32:32

6666
页: [1] 2 3
查看完整版本: Python中的二分查找