python基础-折半查找

这篇博客详细介绍了Python中的折半查找算法。首先分析了需求,然后通过逐步分解,从比较两个数到找到数列中间位置,再到处理查找位置的逻辑,最终将算法封装为自定义函数。博客还提供了总结和思维导图,便于读者理解和应用。

引用我的飞书知识文档:https://ir6elb7gt2.feishu.cn/wiki/wikcnEvrnfdxnMJmy3Dx2o29Wih?office_edit=1

 目录

一、需求分析

二、编程思想

2.1 需求分析

2.2 需求分解

三、总结

四、思维导图


一、需求分析

  • 折半查找:在一串基本有序的数字中找到数字,每次从中间位置开始找

  • 算法设计:

  • 语法知识:

语法

描述

类型转换

类型名(要转化的内容)

分支结构

If:

elseif: else:

循环结构

while

自定义函数

def(函数)

函数调用

函数调用及返回值

  • 触类旁通:

二、编程思想

2.1 需求分析

  • 折半查找:在一串基本有序的数字中找到数字,每次从中间位置开始找​​​​​​

2.2 需求分解

V1.0 :进行两个数的比较

参数列表:罗列代码中涉及的参数和含义

V2.0 :找到一个数列的中间位置开始查找

b=[10,14,18,20,21,23,26,29,32]

left=0, right=8, mid=4, mid=(left+right)//2 //-整除

#  V2.0 :找到一个数列的中间位置开始查找
#  V2.0 :找到一个数列的中间位置开始查找
b = [10, 14, 18, 20, 21, 23, 26, 29, 32]
n = len(b)
left = 0
right = n
mid = (left+right)//2
print("mid=", mid)
a = input("请输入a")
if a == b[mid]:
    print("两个数相等")
else:
    print("两个数不相等")
'''
D:\WMM_Python2\1_PythonBasic\venv\Scripts\python.exe D:/WMM_Python2/1_PythonBasic/aric/search2.py
请输入a44
两个数不相等
请输入a21
两个数不相等
'''

V3.0 :查找位置的处理

如果中间位置的元素小于查找的数字,在后半段查找,left=mid+1

如果中间位置的元素大于查找的数字,在前半段查找,right=mid-1

#  V3.0 :查找位置的处理
b = [10, 14, 18, 20, 21, 23, 26, 29, 32]
n = len(b)
left = 0
right = n
mid = (left+right)//2
print(b[mid])
a = int(input("请输入a"))
if a > b[mid]:
    left = mid+1
elif a < b[mid]:
    right = mid-1
else:
    print("找到a啦")
mid = (left+right)//2
print("新的中间位置mid:", mid, "元素值为:", b[mid])
'''
D:\WMM_Python2\1_PythonBasic\venv\Scripts\python.exe D:/WMM_Python2/1_PythonBasic/aric/search3.py
21
请输入a5
新的中间位置mid: 1 元素值为: 14
请输入a27
新的中间位置mid: 7 元素值为: 29
'''

V4.0 :折半查找循环处理

#  V4.0 :折半查找循环处理
b = [10, 14, 18, 20, 21, 23, 26, 29, 32]
n = len(b)
left = 0
right = n
mid = (left+right)//2
print(b[mid])
a = int(input("请输入a"))
while (left <= right):
    if a > b[mid]:
        left = mid+1
    elif a < b[mid]:
        right = mid-1
    else:
        print("找到a啦")
        break
    mid = (left+right)//2
    print("新的中间位置mid:", mid, "元素值为:", b[mid])
else:
    print("找不到该数字")
'''
D:\WMM_Python2\1_PythonBasic\venv\Scripts\python.exe D:/WMM_Python2/1_PythonBasic/aric/search4.py

请输入a3
新的中间位置mid: 1 元素值为: 14
新的中间位置mid: 0 元素值为: 10
新的中间位置mid: -1 元素值为: 32
找不到该数字
请输入a30
新的中间位置mid: 7 元素值为: 29
新的中间位置mid: 8 元素值为: 32
新的中间位置mid: 7 元素值为: 29
找不到该数字
请输入a14
新的中间位置mid: 1 元素值为: 14
找到a啦
请输入a32
新的中间位置mid: 7 元素值为: 29
新的中间位置mid: 8 元素值为: 32
找到a啦
'''

V5.0 :写入一个自定义函数中

自定义函数:把一段代码放入自定义函数,可以实现反复使用

语法形式:

  • def函数名():函数的定义

  • 函数名():调用函数

  • #  V5.0 :自定义函数
    def search(a, ls):
        n = len(ls)
        left = 0
        right = n
        mid = (left+right)//2
        # print("中间位置mid:", mid, "元素值为:", ls[mid])
        while (left <= right):
            if a > ls[mid]:
                left = mid+1
            elif a < ls[mid]:
                right = mid-1
            else:
                # print("找到a啦")
                return 0
            mid = (left+right)//2
            # print("新的中间位置mid:", mid, "元素值为:", ls[mid])
        # else:
        # print("找不到该数字")
        return 1
    
    
    a = int(input("请输入a"))
    ls = [10, 14, 18, 20, 21, 23, 26, 29, 32]
    result = search(a, ls)
    if result == 0:
        print("找到a啦")
    else:
        print("找不到该数字")
    '''
    D:\WMM_Python2\1_PythonBasic\venv\Scripts\python.exe D:/WMM_Python2/1_PythonBasic/aric/search5.py
    请输入a1
    找不到该数字
    请输入a23
    找到a啦
    '''
    

     

三、总结

总结本次技术应用中可积累的代码和经验

 

 

四、思维导图

 

折半查找(Binary Search),也称为二分查找,是一种在有序数组中查找特定元素的高效算法。其基本思想是将数组分成两部分,然后根据目标值与中间元素的大小关系,确定目标值可能存在的区间,然后继续在该区间内进行查找,直到找到目标值或确定目标值不存在。 ### PTA平台折半查找题目示例及解答 #### 题目描述 在一个有序数组中查找一个特定元素,如果找到则返回其索引,否则返回 -1。 #### 代码实现(Python) ```python def binary_search(arr, target): left, right = 0, 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 = [1, 3, 5, 7, 9, 11, 13] target = 7 result = binary_search(arr, target) print(result) ``` #### 代码解释 1. **初始化左右指针**:`left` 指向数组的起始位置,`right` 指向数组的末尾位置。 2. **进入循环**:只要 `left` 小于等于 `right`,就继续循环。 3. **计算中间位置**:`mid = (left + right) // 2`。 4. **比较中间元素与目标值**: - 如果 `arr[mid]` 等于 `target`,则返回 `mid`。 - 如果 `arr[mid]` 小于 `target`,则将 `left` 更新为 `mid + 1`。 - 如果 `arr[mid]` 大于 `target`,则将 `right` 更新为 `mid - 1`。 5. **如果循环结束仍未找到目标值**:返回 -1。 ### PTA平台折半查找使用指南 #### 理解题目要求 在PTA平台上,首先要仔细阅读题目描述,明确题目要求,例如查找的数组是否有序、是否需要处理重复元素等。 #### 编写代码 根据题目要求编写折半查找的代码,注意边界条件的处理,例如数组为空、目标值不在数组中等情况。 #### 测试代码 在提交代码之前,使用一些测试用例对代码进行测试,确保代码的正确性。 #### 提交代码 将编写好的代码复制到PTA平台的代码编辑器中,然后提交代码进行评测。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值