码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【21天学习经典算法】折半查找与折半插入排序(附Python完整代码)


    前言

    博主一头小山猪目前已开放文章如下:
    一文学懂经典算法系列之:顺序查找(附讲解视频)

    一文学懂经典算法系列之:直接插入排序(附讲解视频)

    一文学懂经典算法系列之:直接选择排序(附讲解视频)

    一文学懂经典算法系列之:折半查找(附讲解视频)

    一文学懂经典算法系列之:折半插入排序(附讲解视频)

    活动地址:CSDN21天学习挑战赛

    本文作者【21天学习经典算法】代码仓地址:https://blog.csdn.net/AlbertDS/article/details/126092510

    折半查找与折半插入排序

    • 前言
    • 正文
      • 折半查找
      • 折半插入排序
    • 代码实现
      • 折半查找代码实现
      • 折半插入排序代码实现
    • 参考资料

    正文

    折半查找也称二分搜索,折半查找其搜索的数组必须是事先经过排序的,折半查找的方式比顺序查找每个元素的方式速度更快,但需要提前了解数据结构的顺序。

    如果我们知道某数据结构已经排过序,并且可以通过数据项的索引直接访问其中的每一个数据项,就可以执行二分搜索(binary search)。根据这一标准,已排序的Python List是二分搜索的理想对象。

    折半查找

    折半查找工作方式
    二分搜索的工作原理如下:查看一定范围内有序元素的中间位置的元素,将其与所查找的元素进行比较,根据比较结果将搜索范围缩小一半,然后重复上述过程。
    在这里插入图片描述
    伪代码
    B i n a r y S e a r c h ( A ) : BinarySearch(A): BinarySearch(A):

    # Find_in_half.py
    left = 1
    right = A.length
    while left <= right
        mid = (left + right) / 2
        if A[mid] == key
            return mid
        else if A[mid] > key
            right = mid - 1
        else
            left = mid + 1
    return -1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    对于折半查找的个人理解
    首先对无序数组 A A A进行排序为有序的数组 A A A,然后采用 l e n ( ) len() len()函数得到数组 A A A的长度,然后对该长度进行除于 2 2 2的运算,在Python中即int(len(A))。这个int(len(A))也是索引值,所以数组 A A A在这个位置的数据num的大小,令目标值target与该数值num进行比较,即target与A[int(len(A)/2)]比较大小,若 t a r g e t > n u m target>num target>num,将数值num前面的所有数据(包括num)排除,反之,则将数值num后面的所有数据(包括num)排除,再次循环折半查找,直到找到最后一个数值,若该数值仍旧不等于target,则输出False。

    折半插入排序

    折半插入排序工作方式
    折半插入排序(Binary Insertion Sort)是对直接插入排序算法的一种改进。 折半插入排序与直接插入排序算法原理相同。 只是,在向已排序的数据中插入数据时,采用来折半查找(二分查找)。 先取已经排序的序列的中间元素,与待插入的数据进行比较,如果中间元素的值大于待插入的数据,那么待插入的数据属于数组的前半部分,否则属于后半部分。
    伪代码
    B i n a r y I n s e r t S o r t ( A ) : BinaryInsertSort(A): BinaryInsertSort(A):

    for i = 2 to A.length
        if A[i] < A[i - 1]
            tmp = A[i]
            low = 0
            high = i - 1
            while low <= high
                mid = (low + high) / 2
                if A[mid] > tmp
                    high = mid - 1
                else
                    low = mid + 1
            for j = i - 1 downto high + 1
                A[j + 1] = A[j]
            A[high + 1] = tmp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    对于折半插入排序的个人理解
    折半插入排序结合了折半查找算法与插入排序算法的工作方式,在插入数据之前先进行折半查找,若插入的数据大于折半查找到的数据,则待插入数据将放置于折半的前置位。反之,则待插入数据将放置于折半的后置位。

    代码实现

    折半查找代码实现

    采用 A = [ 41 , 54 , 95 , 32 , 11 , 5 , 7 , 10 , 21 , 9 , 85 , 12 , 13 , 15 , 64 , 84 ] A = [41, 54, 95, 32, 11, 5, 7, 10, 21, 9, 85, 12, 13, 15, 64, 84] A=[41,54,95,32,11,5,7,10,21,9,85,12,13,15,64,84]
    简易版(待更新)

    函数版

    def binary_contains(gene, key_codon) -> bool:
        low: int = 0
        high: int = len(gene) - 1
        while low <= high:  # while there is still a search space
            mid: int = (low + high) // 2
            if gene[mid] < key_codon:
                low = mid + 1
            elif gene[mid] > key_codon:
                high = mid - 1
            else:
                return True
        return False
    
    
    A = [41, 54, 95, 32, 11, 5, 7, 10, 21, 9, 85, 12, 13, 15, 64, 84]
    my_A = sorted(A)
    print(binary_contains(my_A, 21))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    折半插入排序代码实现

    采用 A = [ 41 , 54 , 95 , 32 , 11 , 5 , 7 , 10 , 21 , 9 , 85 , 12 , 13 , 15 , 64 , 84 ] A = [41, 54, 95, 32, 11, 5, 7, 10, 21, 9, 85, 12, 13, 15, 64, 84] A=[41,54,95,32,11,5,7,10,21,9,85,12,13,15,64,84]
    简易版(待更新)

    
    
    • 1

    函数版

    def BinaryInsertSort(mylist):
        for i in range(1, len(mylist)):
            """将当前元素暂存起来"""
            tmp = mylist[i]
            """在当前位置之前的范围查找插入"""
            low = 0
            high = i - 1
            """将范围折半再查找"""
            while low <= high:
                m = int((low + high) / 2)
                """tmp比范围中点大,范围后半段作为新的查找范围"""
                if tmp > mylist[m]:
                    low = m + 1
                else:
                    """tmp比范围中点小,范围前半段作为新的查找范围"""
                    high = m - 1
            """此时mylist[high]的元素比tmp小"""
            j = i - 1
            """mylist[high]之后的元素往后挪一位"""
            while j >= high + 1:
                mylist[j + 1] = mylist[j]
                j -= 1
            """将tmp放在mylist[high]之后"""
            mylist[high + 1] = tmp
     
    if __name__ == "__main__":
        A = [41, 54, 95, 32, 11, 5, 7, 10, 21, 9, 85, 12, 13, 15, 64, 84]
        BinaryInsertSort(A)
        print(mylist)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    参考资料

    1. 小山猪——经典算法专栏
    2. 数据结构教程 第5版
    3. 折半插入排序算法
    4. 折半插入排序——插入算法(python)
  • 相关阅读:
    2022年全球一次能源消费量:石油消耗量持续增加达190.69百亿亿焦耳,亚太地区消费量居首位[图]
    GBASE 8s存储过程执行和删除
    开源软件的影响力及未来发展趋势
    tree命令-以树形结构显示目录下的内容
    写的一款简易的热点词汇记录工具
    关于Godot动态生成节点的细节
    计算机组成原理——计算机系统概述(课程笔记)
    SQL 之 ROW_NUMBER() OVER函数用法
    ROS2的launch有何不同?
    MATLAB_双馈风力发电机-900V直流混合储能并网系统MATLAB仿真
  • 原文地址:https://blog.csdn.net/AlbertDS/article/details/126278562
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号