Python 算法基础篇:插入排序和希尔排序

news2024/11/25 7:39:50

Python 算法基础篇:插入排序和希尔排序

  • 引言
  • 1. 插入排序算法概述
  • 2. 插入排序算法实现
    • 实例1:插入排序
  • 3. 希尔排序算法概述
  • 4. 希尔排序算法实现
    • 实例2:希尔排序
  • 5. 插入排序与希尔排序的对比
  • 总结

引言

插入排序和希尔排序是两种常用的排序算法,用于将一个无序列表按照特定顺序重新排列。本篇博客将介绍插入排序和希尔排序的基本原理,并通过实例代码演示它们的应用。

😃😄 ❤️ ❤️ ❤️

1. 插入排序算法概述

插入排序是一种简单直观的排序算法,它将列表分成已排序部分和未排序部分。在每次遍历中,插入排序会将未排序部分的第一个元素插入到已排序部分的适当位置,使得已排序部分继续保持有序。

插入排序的主要优点是实现简单,代码量较小,并且在处理小规模数据时效率较高。然而,在处理大规模数据时,插入排序的时间复杂度较高,为 O ( n ^ 2 ),效率相对较低。

2. 插入排序算法实现

实例1:插入排序

def insertion_sort(arr):
    n = len(arr)

    # 从第二个元素开始遍历未排序部分
    for i in range(1, n):
        key = arr[i]  # 当前要插入的元素
        j = i - 1     # 已排序部分的最后一个元素的索引

        # 将大于key的元素向右移动,为key腾出插入位置
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1

        # 插入key到正确的位置
        arr[j + 1] = key

# 测试插入排序
arr = [64, 34, 25, 12, 22, 11, 90]
insertion_sort(arr)
print("插入排序结果:", arr)

代码解释:上述代码演示了使用插入排序对一个列表进行排序的实例。插入排序将列表分成已排序部分和未排序部分,在每次遍历时,将未排序部分的第一个元素插入到已排序部分的适当位置。通过使用 while 循环找到正确的插入位置,实现了插入排序算法。

3. 希尔排序算法概述

希尔排序是一种改进的插入排序算法,它通过设置一个增量序列,对列表进行多次分组排序。希尔排序会不断缩小增量序列的长度,直到增量序列为 1 ,此时就变为普通的插入排序。

希尔排序的主要优点是对于中等大小的列表,它的性能较好。希尔排序的时间复杂度介于 O ( n )和 O ( n ^ 2 )之间,取决于增量序列的选择。虽然希尔排序相对于插入排序有所改进,但在处理大规模数据时仍然不如快速排序和归并排序等高效的排序算法。

4. 希尔排序算法实现

实例2:希尔排序

def shell_sort(arr):
    n = len(arr)
    gap = n // 2  # 初始增量,可根据实际情况调整

    while gap > 0:
        for i in range(gap, n):
            key = arr[i]
            j = i

            # 插入排序,但是步长为gap
            while j >= gap and arr[j - gap] > key:
                arr[j] =

 arr[j - gap]
                j -= gap

            arr[j] = key

        gap //= 2  # 缩小增量

# 测试希尔排序
arr = [64, 34, 25, 12, 22, 11, 90]
shell_sort(arr)
print("希尔排序结果:", arr)

代码解释:上述代码演示了使用希尔排序对一个列表进行排序的实例。希尔排序通过设置增量序列,对列表进行多次分组排序。在每次遍历时,使用插入排序对分组的元素进行排序。通过不断缩小增量序列的长度,最终将列表排序完成。

5. 插入排序与希尔排序的对比

插入排序和希尔排序都是通过插入元素到已排序部分来完成排序,但希尔排序在插入排序的基础上进行了改进。

  • 插入排序的增量序列为 1 ,每次只能将相邻元素进行比较和交换,因此时间复杂度较高。

  • 希尔排序的增量序列由用户指定,可以对列表进行多次分组排序,使得每次插入排序的步长较大,从而减少了比较和交换的次数,提高了效率。

虽然希尔排序相对于插入排序有所改进,但在处理大规模数据时仍然不如快速排序和归并排序等高效的排序算法。

总结

本篇博客介绍了插入排序和希尔排序两种排序算法。插入排序通过比较相邻元素并插入到合适的位置,使得已排序部分继续保持有序;希尔排序通过设置增量序列对列表进行多次分组排序,减少了比较和交换的次数,提高了效率。

插入排序适用于小规模数据的排序,而希尔排序适用于中等规模的数据排序。在实际应用中,选择合适的排序算法对于提高程序性能非常重要。

[ 专栏推荐 ]
😃 Python 算法初阶:入门篇》😄
❤️【简介】:本课程是针对 Python 初学者设计的算法基础入门课程,涵盖算法概念、时间复杂度、空间复杂度等基础知识。通过实例演示线性搜索、二分搜索等算法,并介绍哈希表、深度优先搜索、广度优先搜索等搜索算法。此课程将为学员提供扎实的 Python 编程基础与算法入门,为解决实际问题打下坚实基础。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/781024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java后端导出前端展示

效果图 前端代码 exportExcelAll(){window.location.href getBaseUrl() Action/excelDataAll?happenDatethis.params.happenDate;},后端代码 try{Workbook workbooknew XSSFWorkbook();//创建sheetSheet sheet1workbook.createSheet("结果总数拦截记录");//写入…

第一百一十二天学习记录:数据结构与算法基础:循环链表和双向链表以及线性表应用(王卓教学视频)

循环链表 带尾指针循环链表的合并 双向链表 单链表、循环链表和双向链表的时间效率比较 顺序表和链表的比较 链式存储结构的优点 1、结点空间可以动态申请和释放&#xff1b; 2、数据元素的逻辑次序靠结点的指针来指示&#xff0c;插入和删除时不需要移动数据元素。 链式存储…

【pytho】request五种种请求处理为空和非空处理以及上传excel,上传图片处理

一、python中请求处理 request.args获取的是个字典&#xff0c;所以可以通过get方式获取请求参数和值 request.form获取的也是个字典&#xff0c;所以也可以通过get方式获取请求的form参数和值 request.data&#xff0c;使用过JavaScript&#xff0c;api调用方式进行掺入jso…

[数据结构 -- C语言] 二叉树(BinaryTree)

目录 1、树的概念及结构 1.1 树的概念 1.2 树的相关概念&#xff08;很重要&#xff09; 1.3 树的表示 2、二叉树的概念及结构 2.1 概念 2.2 特殊二叉树 2.3 二叉树的性质&#xff08;很重要&#xff09; 2.4 练习题 2.5 二叉树的存储结构 2.5.1 顺序存储 2.5.2 链…

Windows10 下 Neo4j1.5.8 安装教程

前言 Neo4j 是一个高性能的、NOSQL 图形数据库&#xff0c;它将结构化数据存储在网络上而不是表中。基于磁盘的、具备完全的事务特性的 Java 持久化引擎&#xff0c;这里就不把他和常用关系型数据库做对比了。因为篇幅有限&#xff0c;我这里也是第一次使用&#xff0c;所以以…

windows安装cmake快速教程

1、下载cmake cmake官网直直接下载速度都很慢&#xff0c;可以到点击下载地址进行下载。 点击下载地址进去之后&#xff0c;可以看到有很多的版本&#xff0c;这里根据自己的需要选一个版本即可&#xff08;建议不要选择太早的版本&#xff09;&#xff0c;我这里选择的3.22版…

【Python】串口通信-与FPGA、蓝牙模块实现串口通信(Python+FPGA)

&#x1f389;欢迎来到Python专栏~与FPGA、蓝牙模块实现串口通信 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文中出现错误&#…

基于Java+SpringBoot+vue前后端分离校园周边美食探索分享平台设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

SpringCloud nacos 集成 feign 实例

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

【运维工程师学习七】DNS底层原理及搭建自己的DNS服务器

【运维工程师学习七】DNS底层原理及搭建自己的DNS服务器 0、前言1、域名&#xff08;Domain&#xff09;的由来2、域名&#xff08;Domain&#xff09;的级别3、域名&#xff08;Domain&#xff09;的命名规则4、域名&#xff08;Domain&#xff09;的后缀有哪些5、域名&#x…

[QT编程系列-32]:科学计算 - QT支持的科学计算库

目录 第1章 QT中如何支持科学计算&#xff1f; 1.1 QT没有专门的科学计算库 1.2 QT没有专门的数学运算库 1.3 QT没有数字信号DSP处理库 1.4 QT没有类numpy库 1.5 QT支持的数学运算 第2章 QT数学库详解 2.1 QtMath 2.2 QVector 2.3 QMatrix 第1章 QT中如何支持科学计算…

【数据结构】——LRU Cache

这里写目录标题 什么是LRU CacheLRU Cache的实现LRU Cache的OJ 什么是LRU Cache LRU是Least Recently Used的缩写&#xff0c;意思是最近最少使用&#xff0c;它是一种Cache替换算法。 什么是Cache&#xff1f;狭义的Cache指的是位于CPU和主存间的快速RAM&#xff0c; 通常它不…

【Soft NMS】《Soft-NMS – Improving Object Detection With One Line of Code》

ICCV-2017 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Results5.2 Sensitivity Analysis5.3 When does Soft-NMS work better?5.4 Qualitative Results 6 Conclusion&#xff08;own&#xff09; 1 Background…

【Android】Ubuntu20.04编译Android 13并用模拟器运行

前言 一直好奇Android系统是怎么定制的&#xff0c;直到亲自走一遍Android系统编译流程才发现并没想象的复杂。 这就跟app开发一样&#xff0c;Google官方其实都提供了平台、文档、IDE及一些工具&#xff0c;咱们只要按照官方提供的指南来操作就行了。 如果Android没有提供这…

15 QMessageBox消息对话框

错误提示对话框 信息提示对话框 循环对话框 默认是Yes和No&#xff0c;可以修改属性。第5个参数关联回车键 QMessageBox::Save | QMessageBox::Cancel 可以通过捕获按键获取点击结果 警告提示 代码&#xff1a; //QMessageBox 消息对话框//错误提示QMessageBox::critical(th…

11 spring-boot的MVC配置原理

11.1 spring-boot为MVC提供的自动配置 1.ContentNegotiatingViewResolver视图解析器&#xff1b; 2.静态资源或者支持WebJars&#xff1b; 3.自动注册类型转换器&#xff1a;比如说前台提交user的字段&#xff0c;后台自动封装的意思&#xff1b; 4.HttpMessageConverters&…

计算机视觉(一)图像预处理

本章内容 图像显示与存储原理颜色空间RGB颜色空间CMY&#xff08;K&#xff09;颜色空间HSV颜色空间CIE-XYZ颜色空间 图片存储原理主流颜色空间 图像增强的目标图像处理方法点运算&#xff1a;基于直方图的对比度增强直方图 &#xff1a;对数据空间&#xff08;bin&#xff09;…

了解 3DS MAX 3D摄像机跟踪设置:第 1 部分

这是一个关于使用行业标准插件 RayFire 在 3ds Max 中破坏元素的新系列。在本教程的第一部分中&#xff0c;我将向您展示如何在 RayFire 中使用在 3ds Max 中拆除元素的最基本操作和方法。 推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 准备场景 步…

使用Gin框架搭配WebSocket完成实时聊天

文章目录 前言实时聊天聊天功能测试发送信息 前言 在写项目的时候&#xff0c;需要完成实时聊天的功能&#xff0c;于是简单的学习下WebSocket&#xff0c;想知道WebSocket是什么的小伙伴可以去网上别的地方学习一下。 要实现实时聊天&#xff0c;网上的大部分内容都是Spring…

【MI】ModuleNotFoundError: No module named ‘braindecode.datautil.signalproc‘

使用HGD数据集时&#xff0c;需要从braindecode中调用 一直显示ModuleNotFoundError 以为是导入braindecode的版本太新了&#xff0c;于是在braindecode官网上找代码对应版本&#xff0c;一直找不到&#xff0c;最后从github上找到了代码的使用指南 GitHub - braindecode/br…