首页 > 编程语言 >探索Python中的插入排序算法

探索Python中的插入排序算法

时间:2024-08-11 14:27:09浏览次数:12  
标签:arr Python 插入排序 元素 算法 key 排序

探索Python中的插入排序算法

插入排序(Insertion Sort)是一种简单直观的排序算法。虽然在大规模数据集上效率不如一些高级排序算法,但插入排序在处理小规模数据集或部分有序的数据时表现非常优秀。本文将介绍插入排序的工作原理、实现方法以及它的时间复杂度。

插入排序的工作原理

插入排序的思想类似于整理一副扑克牌。你一张一张地抓起牌,然后将它们插入到已排序的牌堆中。每当你抓起一张新牌时,你会将它与已有的牌进行比较,找到正确的位置插入。

具体步骤如下:

  1. 从数组的第二个元素开始(第一个元素视为已排序)。
  2. 将当前元素与前面已排序部分的元素进行比较,从右到左找到合适的位置,并将当前元素插入。
  3. 重复上述步骤,直到整个数组有序。

Python中的插入排序实现

以下是插入排序的Python实现:

def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        # 将当前元素插入到前面的有序部分
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key
    return arr

# 测试案例
unsorted_array = [12, 11, 13, 5, 6]
sorted_array = insertion_sort(unsorted_array)
print("排序后的数组:", sorted_array)

代码解析

1.‘for i in range(1, len(arr))’: 外层循环从数组的第二个元素开始,逐个处理未排序的元素。
2. ‘key = arr[i]’: key是当前需要插入的元素。
3. ‘j = i - 1’: j指向已排序部分的最后一个元素。
4. ‘while j >= 0 and key < arr[j]’: 内层循环将key与前面的元素比较,如果前面的元素大于key,就将前面的元素向后移动一位。
5. ‘arr[j + 1] = key’: 当找到key的正确位置后,将其插入。

插入排序的优化

插入排序本质上是稳定的,且对部分有序的数组表现良好。例如,如果一个数组已经大部分有序,只需很少的交换即可完成排序。这种特性使得插入排序在实际应用中仍然有一定的价值,特别是在对小型或几乎有序的数据集进行排序时。

插入排序的时间复杂度

插入排序的时间复杂度取决于输入数据的有序程度:

  • 最坏情况:当输入数组是反序时,时间复杂度为O(n²)。
  • 最好情况:当输入数组已经有序时,时间复杂度为O(n)。
  • 平均情况:时间复杂度为O(n²)。

插入排序的实际应用

插入排序在一些特定场景下有实际应用价值:

  1. 小规模数据集:对于元素较少的数组或列表,插入排序的简单实现和低开销使其成为理想选择。
  2. 部分有序数据:在处理几乎有序的数据时,插入排序能够迅速完成排序。
  3. 在线算法:插入排序适合处理数据流,即实时接收数据并保持其有序。

结论

插入排序作为一种简单但有效的排序算法,在特定场景中仍然有其独特的优势。通过理解插入排序的原理和实现,我们可以更深入地了解排序算法的基础知识,为进一步学习更复杂的算法奠定基础。如果你对排序算法感兴趣,接下来我们可以继续探索其他算法,如选择排序、快速排序和归并排序。

标签:arr,Python,插入排序,元素,算法,key,排序
From: https://blog.csdn.net/qq_61017533/article/details/141105120

相关文章

  • Dijkstra算法
    Dijkstra算法是一种用于在加权图中寻找单源最短路径的算法。它由荷兰计算机科学家EdsgerDijkstra在1956年提出。该算法基于贪心策略,通过不断选择当前最短路径上的顶点来逐步确定最短路径。它使用一个距离数组来记录起始点到每个顶点的距离,并使用一个集合来存储已经求得最短路......
  • 使用 Python 爬取豆瓣电影 Top250 多页数据
    使用Python爬取豆瓣电影Top250多页数据创建时间:2024-08-11一、完整代码'''抓取单贞数据中的评分简介评价人数将上面的改为多页https://movie.douban.com/top250?start=0'''importrequestsfromlxmlimportetreeheader={'User-Agent':'Mozilla/5.0......
  • 图像分割算法
    5.1阈值分割(Thresholding)介绍阈值分割是一种简单而有效的图像分割方法,通过设置一个或多个阈值,将图像分割为前景和背景区域。常见的阈值分割方法包括全局阈值、自适应阈值和Otsu阈值。原理阈值分割通过比较像素值与设定的阈值,将像素分类为前景或背景。公式在阈值分割......
  • 499 道 Java 面试题 (附答案):JVM+ 分布式 + 算法 + 锁 +MQ
    Spring如何管理事务的。Spring怎么配置事务(具体说出一些关键的xml元素)。说说你对Spring的理解,非单例注入的原理?它的生命周期?循环注入的原理,aop的实现原理,说说aop中的几个术语,它们是怎么相互工作的。Springmvc中DispatcherServlet初始化过程。netty......
  • python代码实现老鹰抓小鸡游戏
    importpygameimportrandom#初始化pygamepygame.init()#设置屏幕尺寸和颜色WIDTH,HEIGHT=800,600BACKGROUND_COLOR=(255,255,255)EAGLE_COLOR=(0,0,255)CHICK_COLOR=(255,255,0)FPS=30#创建游戏窗口screen=pygame.display.set_mode((WIDTH,......
  • python代码实现挑棍游戏
    importrandomdefprint_sticks(sticks):  """打印当前的棍子状态"""  print("当前棍子状态:",''.join(str(i)foriinrange(1,sticks+1)))defplayer_turn(sticks):  """处理玩家的回合"""  ......
  • 【Python蓝屏程序(管理员)】
    说明:该程序为临摹(......
  • 7-2广告算法业务
    1.两种广告广告按其投放目的可以分成两类:效果广告和品牌广告。效果广告是为了直接提升某个产品的用户数量或者销售收入。而品牌广告则是为了通过提升品牌知名度美誉度从而间接带来该品牌产品用户和销售收入的增长。大家所熟悉的互联网广告大部分都是效果广告。如:微信的朋......
  • BUUCTF 81题吹着贝斯的二维码详解(包含各类工具和python脚本)
    在网上看了很多类似解题步骤和说明,感觉对小白都不友好,于是决定搜集整理下,做个详尽的解题步骤:压缩包解压得到36个无后缀名文件和一个flag.zip压缩包再看压缩包,解压发现有压缩密码,用winhex查看是不是伪加密,在末尾发现一串可疑字符串,拷贝下来留用:GNATOMJVIQZUKNJXGRCTGNRTG......
  • python asyncio grpc
    1.准备环境python3.11-mvenvvenvsourcevenv/*/activatepipinstallgrpcio-tools#包含了grpcio和protobufpipinstalltypes-protobufgrpc-stubs#可选安装,用于mypy静态检查2.编写msg.protosyntax="proto3";//这是注释,同时也是类文档serviceMsgService{......