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

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 编程基础与算法入门,为解决实际问题打下坚实基础。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day 61-62 决策树(ID3)

代码&#xff1a; package dl;import java.io.FileReader; import java.util.Arrays; import weka.core.*;/*** The ID3 decision tree inductive algorithm.*/ public class ID3 {/*** The data.*/Instances dataset;/*** Is this dataset pure (only one label)?*/boolean …

结构型模式 - 适配器模式

概述 如果去欧洲国家去旅游的话&#xff0c;他们的插座如下图最左边&#xff0c;是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑&#xff0c;手机在当地不能直接充电。所以就需要一个插座转换器&#xff0c;转换器第1面插入当地的插座&#xff0c;第2面供…

springboot+vue开发后台增删改查

效果图 前端代码【User.vue】 <template><div class"data-container"><!--添加 start--><div class"data-header"><el-button round click"addHander" size"large" type"primary"><el-ic…

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归多输入单输出区间预测

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归多输入单输出区间预测 目录 区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归多输入单输出区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 区间预测 | MATLAB实现QRBiLSTM…

uview中的常用的框

第一步&#xff1a; 先下载 uview UI 框架 详见 项目 引入 uView_vue引入uview_qq_2524963996的博客-CSDN博客【代码】 项目 引入 uView。_vue引入uviewhttps://blog.csdn.net/qq_44161703/article/details/131168976?spm1001.2014.3001.5501 第二步&#xff1a; 可以直接…

解锁潜力,驭数赋能:大数据与云计算的强强联合

随着数字化时代的来临&#xff0c;大数据和云计算已成为信息技术领域的两大热门话题。大数据指的是以海量、高速、多样化的数据为基础&#xff0c;通过分析和挖掘来获得有价值的信息和洞察。而云计算则是一种基于网络的计算模式&#xff0c;通过将数据和应用程序存储在云端服务…

【前端动画】科技感扫描效果 css动画animation

扫描出现动画 参考了网友写的二维码扫描 <template><div><div class"scan-content"><img style"width: 2rem;height: 2rem;" src"../../assets/images/eye.png" alt"" /><div class"line">…

Express 框架的基本操作

目录 1、应用生成器 2、基本路由 2.1、在跟路由下配置 GET请求&#xff0c;返回对应相应内容。 2.2、在跟路由下配置 POST请求&#xff0c;返回对应相应内容。 2.3、在跟路由下配置 PUT请求&#xff0c;返回对应相应内容。 2.4、在根路由下配置DELETE请求&#xff0c;返回对…

<Java物联网> 从主动到被动:Java中的BACnet设备属性查询

目录 BACnet 使用软件 资源 模拟器 使用Java主动查 引入maven 创建网络对象 获取远程设备 获取设备属性 使用DeviceEventAdapter订阅 初始化本地BACnet设备和IP网络配置&#xff1a; 启动本地设备和添加监听器&#xff1a; 搜寻远程设备&#xff1a; 发送订阅COV报…

mybatis事物是如何和spring事物整合的

目录 1、mybatis事物管理器 2、SpringManagedTransactionFactory如何处理事物 3、spring事物如何设置connection连接到threadLocal 1、mybatis事物管理器 mybatis事物抽象接口类&#xff1a;Transaction。该接口定义了事物基本方法和获取数据库连接方法 该类有三个实现类Jd…

基于Java+SpringBoot+Vue前后端分离旅游网站详细设计和实现

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

pytorch工具——使用pytorch构建一个分类器

目录 分类器任务和数据介绍训练分类器的步骤在GPU上训练模型 分类器任务和数据介绍 训练分类器的步骤 #1 import torch import torchvision import torchvision.transforms as transformstransformtransforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.…

docker数据网络管理

数据管理 管理 Docker 容器中数据主要有两种方式&#xff1a;数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&#xff09;。 1&#xff0e;数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机的目录挂…

详细解析python视频选择--【思维导图知识范围】

C ,JAVA JAVAWEB ,微信小程序等 都有视频选择的分析。 语言视频选择收录专辑链接C张雪峰推荐选择了计算机专业之后-在大学期间卷起来-【大学生活篇】JAVA黑马B站视频JAVA部分的知识范围、学习步骤详解JAVAWEB黑马B站视频JAVAWEB部分的知识范围、学习步骤详解SpringBootSpringB…

Qt/C++音视频开发48-推流到rtsp服务器

一、前言 之前已经打通了rtmp的推流&#xff0c;理论上按照同样的代码&#xff0c;只要将rtmp推流地址换成rtsp推流地址&#xff0c;然后格式将flv换成rtsp就行&#xff0c;无奈直接遇到协议不支持的错误提示&#xff0c;网上说要换成rtp&#xff0c;换了也没用&#xff0c;而…

斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 13 Neural Nets and Deep Learning

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 13 Neural Nets and Deep Learning In this chapter, we shall consider the design of neural nets, which are collections of perceptrons, or nodes, where the outputs of one rank (or lay…

使用 Docker 快速上手中文版 LLaMA2 开源大模型

本篇文章&#xff0c;我们聊聊如何使用 Docker 容器快速上手朋友团队出品的中文版 LLaMA2 开源大模型&#xff0c;国内第一个真正开源&#xff0c;可以运行、下载、私有部署&#xff0c;并且支持商业使用。 写在前面 感慨于昨天 Meta LLaMA2 模型开放下载之后&#xff0c;Git…

Spring Security 的工作原理/总体架构

目录 1、过滤器的视角 2、DelegatingFilterProxy 委派过滤器代理&#xff08;类&#xff09; 2、FilterChainProxy 过滤器链代理&#xff08;类&#xff09; 4、SecurityFilterChain 安全过滤器链&#xff08;接口&#xff09; 5、Security Filters 安全过滤器实例 6、Sp…

基于sklearn计算precision、recall等分类指标

文章目录 一、分类指标函数1.1 precision_score函数1.2 recall_score函数1.3 accuracy_score函数1.4 f1_score函数1.5 precision_recall_curve函数1.6 roc_curve函数1.7 roc_auc_score函数1.8 classification_report函数 二、二分类任务三、多分类任务3.1 Macro Average&#x…