【算法基础】插入排序与二分查找、升级二分查找

文章目录

  • [1. 插入排序](#1. 插入排序)
    • [1.1 插入排序的思想](#1.1 插入排序的思想)
    • [1.2 插入排序的实现](#1.2 插入排序的实现)
  • [2. 普通二分查找](#2. 普通二分查找)
    • [2.1 普通二分查找的思想](#2.1 普通二分查找的思想)
    • [2.2 普通二分查找的实现](#2.2 普通二分查找的实现)
  • [3. 升级二分查找](#3. 升级二分查找)
    • [3.1 升级二分查找思想](#3.1 升级二分查找思想)
    • [3.2 升级二分查找实现](#3.2 升级二分查找实现)

1. 插入排序

1.1 插入排序的思想

插入排序很类似于已有一副有序的扑克牌,不断地通过值比较,将新的扑克牌插入到有序的扑克牌中(通过将新的扑克牌和有序的扑克牌进行比较)。

插入排序在代码实现上可能和冒泡有点像,但从算法的时间复杂度上分析,插入排序会优于冒泡排序。插入排序在遇到如 [ 1 , 2 , 3 , 4 , 5 , 6 ] [1, 2, 3, 4, 5, 6] [1,2,3,4,5,6]这种数据排列时,时间复杂度是常数项

选择排序和冒泡排序的时间复杂度都是 O ( n 2 ) O(n^2) O(n2),这两种排序算法都是与数据排列无关的。在遇到上述那种数据排列时,还是会执行 n 2 n^2 n2次

1.2 插入排序的实现

python 复制代码
def swap(arr, i, j):
    temp = arr[i]
    arr[i] = arr[j]
    arr[j] = temp


if __name__ == '__main__':
    arr = [6, 3, 1, 4, 2, 5]
    print("原数组:", arr)

    for i in range(1, len(arr)):
        for j in range(i, 0, -1):
            if arr[j] >= arr[j - 1]:
                continue
            else:
                swap(arr, j, j - 1)
    print("排序后的数组:", arr)

2. 普通二分查找

在一个有序数组中,找某个数是否存在

2.1 普通二分查找的思想

在一个有序数组 中,通过不断将数组二分来寻找最小值。

2.2 普通二分查找的实现

python 复制代码
if __name__ == '__main__':
    arr = [6, 3, 1, 4, 2, 5]
    print("原数组:", arr)

    arr = sorted(arr)
    print("排序后的数组:", arr)

    fN = 4
    low = 0
    high = len(arr) - 1
    print("想要找的数为:", fN)
    while True:
        mid = int((low + high) / 2)
        if mid == low or mid == high:
            print("数不存在")
            break
        if arr[mid] == fN:
            flag = True
            print("数存在,位于数组的第", mid, "位")
            break;
        elif arr[mid] > fN:
            high = mid - 1
        elif arr[mid] < fN:
            low = mid + 1

3. 升级二分查找

在一个有序数组中,找>=某个数最左侧的位置

3.1 升级二分查找思想

和普通二分很类似,就是一点点的差异

3.2 升级二分查找实现

python 复制代码
if __name__ == '__main__':
    arr = [6, 3, 1, 4, 2, 5]
    print("原数组:", arr)

    arr = sorted(arr)
    print("排序后的数组:", arr)

    fN = 4
    low = 0
    high = len(arr) - 1
    print("想要找的数为:", fN)
    while True:
        if low > high:
            print("想要找的数最左侧位于数组的第", low, "位")
        mid = int((low + high) / 2)
        if mid == low or mid == high:
            print("数不存在")
            break
        if arr[mid] >= fN:
            high = mid - 1
        elif arr[mid] < fN:
            low = mid + 1
相关推荐
仰泳的熊猫1 小时前
LeetCode:538. 把二叉搜索树转换为累加树/1038. 从二叉搜索树到更大和树
数据结构·c++·算法·leetcode
weixin_307779131 小时前
Clickhouse导出库的表、视图、用户和角色定义的SQL语句
开发语言·数据库·算法·clickhouse·自动化
piggy侠1 小时前
【GitHub每日速递 251016】23k star,Daytona:90ms内极速运行AI代码,安全弹性基础设施来袭!
算法·github
小龙报1 小时前
《算法通关指南---C++编程篇(1)》
开发语言·c++·程序人生·算法·学习方法·visual studio
在繁华处1 小时前
C语言初步学习:数组的增删查改
c语言·数据结构·学习
月夜的风吹雨1 小时前
【数据结构】:C 语言常见排序算法的实现与特性解析
c语言·数据结构·排序算法
Cx330❀2 小时前
《C++ 手搓list容器底层》:从结构原理深度解析到功能实现(附源码版)
开发语言·数据结构·c++·经验分享·算法·list
Swift社区2 小时前
LeetCode 399 除法求值
算法·leetcode·职场和发展
仰泳的熊猫2 小时前
LeetCode:98. 验证二叉搜索树
数据结构·c++·算法·leetcode
Python智慧行囊2 小时前
图像处理(三)--开运算与闭运算,梯度运算,礼帽与黑帽
人工智能·算法·计算机视觉