插入排序法解析

news2024/11/25 20:47:18

img

插入排序法解析

什么是插入排序法

插入排序法是一种简单但有效的排序算法,其基本思想是将一个待排序的元素逐个插入到已经排好序的元素序列中,直至所有元素都被插入完成,从而得到一个有序序列。

具体步骤如下:

  1. 假设初始时,第一个元素自成一个有序序列,可以视为已排序部分。
  2. 从第二个元素开始,将它与已排序序列从右往左进行比较,并找到合适的位置插入。
  3. 将待插入元素与已排序序列中的元素逐一比较,如果待插入元素较小,则将已排序元素向右移动一个位置,为待插入元素腾出位置。
  4. 重复步骤3,直到找到插入位置或已遍历完已排序序列。
  5. 将待插入元素插入到找到的插入位置。
  6. 重复步骤2-5,直到所有元素都被插入到正确的位置,排序完成。

插入排序法的时间复杂度为O(n^2),其中n表示待排序元素的个数。在实际情况中,插入排序对于小规模或部分有序的序列表现良好,但对于大规模乱序的序列效率相对较低。

值得注意的是,插入排序是一种稳定的排序算法,即相等元素的相对顺序在排序后保持不变。这使得它在某些特定场景下具有一定的优势。

总结:插入排序通过逐个比较和插入操作来构建有序序列,是一种简单而实用的排序算法。虽然时间复杂度较高,但对于小规模和部分有序的序列可以获得不错的性能。

代码演示

提供一个使用Python实现插入排序的示例代码:

def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]  # 当前待插入元素
        j = i - 1     # 已排序部分的最后一个元素下标

        # 将大于待插入元素的元素向右移动
        while j >= 0 and arr[j] > key:
            arr[j + 1] = arr[j]
            j -= 1

        # 在合适位置插入待插入元素
        arr[j + 1] = key

# 测试示例
array = [9, 5, 2, 8, 1, 7]
insertion_sort(array)
print("排序结果:", array)

运行以上代码,将会输出排序结果:

排序结果: [1, 2, 5, 7, 8, 9]

这段代码通过迭代待排序的数组,将每个元素插入到已排序的子数组中的正确位置,从而得到一个有序的数组。希望这个示例能够帮助您理解插入排序算法的实现过程。

算法优化

为了优化插入排序算法,可以考虑以下两种常见的优化方法:二分查找插入和提前终止。

  1. 二分查找插入:
    在插入排序的过程中,可以利用二分查找来确定待插入元素的正确位置。具体步骤如下:

    • 将待插入元素与已排序部分的中间元素进行比较。
    • 如果待插入元素小于中间元素,则将插入位置限定在左半部分;否则,将插入位置限定在右半部分。
    • 重复以上步骤,缩小查找范围,直到确定待插入元素的位置。
    • 插入元素到正确位置后,将已排序部分的元素整体向右移动一个位置,给待插入元素腾出空间。
  2. 提前终止:
    在插入排序的过程中,如果发现待插入元素已经处于正确的位置上,则可以提前终止内层循环,减少不必要的比较次数。

下面是对插入排序算法进行了优化的示例代码:

def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]  # 当前待插入元素
        left = 0      # 已排序部分的起始位置
        right = i - 1 # 已排序部分的最后一个元素下标

        # 使用二分查找找到待插入元素的正确位置
        while left <= right:
            mid = (left + right) // 2
            if arr[mid] < key:
                left = mid + 1
            else:
                right = mid - 1

        # 在合适位置插入待插入元素,并提前终止内层循环(如果已经处于正确位置)
        for j in range(i - 1, left - 1, -1):
            if arr[j] == key:
                break
            arr[j + 1] = arr[j]
        else:
            arr[left] = key

# 测试示例
array = [9, 5, 2, 8, 1, 7]
insertion_sort(array)
print("排序结果:", array)

通过以上优化,插入排序算法可以更高效地对数组进行排序。希望这个优化后的示例能够满足您的需求。

心得体会

对于算法优化,以下是一些心得体会:

  1. 理解算法的时间复杂度:在进行算法优化之前,首先要对待优化的算法的时间复杂度进行评估和理解。只有了解算法的时间复杂度特点,才能有针对性地进行优化。

  2. 寻找瓶颈点:在进行算法优化时,需要找到影响算法性能的瓶颈点。这些瓶颈点通常是导致算法效率低下的关键操作或重复计算。通过优化瓶颈点,可以提高算法的整体性能。

  3. 利用空间换时间:有时候,通过使用额外的空间来存储中间结果或使用辅助数据结构,可以加速算法的执行。这种利用空间换时间的策略在某些情况下是有效的。

  4. 深入理解数据结构和算法:良好的数据结构选择和算法设计是高效算法的基础。深入理解各种数据结构和算法,并熟悉它们的特性和应用场景,可以帮助我们更好地进行算法优化。

  5. 基于实际情况进行分析和选择:不同的算法优化方法适用于不同的问题和场景。根据具体的需求和实际情况,选择合适的优化策略。在进行算法优化时,还要考虑到代码的可读性、可维护性和扩展性。

  6. 测试和评估:对优化后的算法进行充分的测试和评估是必要的。通过比较优化前后算法的性能和结果的正确性,可以验证优化的有效性,并根据需要进行进一步的调整和改进。

在进行算法优化时,还要考虑到代码的可读性、可维护性和扩展性。

  1. 测试和评估:对优化后的算法进行充分的测试和评估是必要的。通过比较优化前后算法的性能和结果的正确性,可以验证优化的有效性,并根据需要进行进一步的调整和改进。

总之,算法优化是一个持续学习和实践的过程。通过深入理解算法原理、掌握合适的优化技巧和经验,并结合实际问题进行分析和实践,我们可以不断提升算法的效率和性能。

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

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

相关文章

EasyCVR开启强制重置密码后页面显示异常的问题优化

EasyCVR基于云边端协同架构&#xff0c;可支持多协议、多类型的海量设备接入与分发&#xff0c;平台既具备传统安防视频监控的能力&#xff0c;也具备接入AI智能分析的能力&#xff0c;在线下均有大量应用。 近期我们对EasyCVR平台的安全性进行了技术升级&#xff0c;平台将默认…

Linux:rsync

一款快速增量备份工具【Remote Sync&#xff0c;远程同步】 远程灾难备份功能 *支持本地复制&#xff0c;或者与其他SSH、rsync主机同步 配置rsync源服务器【rsync同步源】 *指备份操作的远程服务器&#xff0c;也称为备份源 web服务器本地有服务器&#xff0c;IDC机房有备…

postman每次请求前获取token并保存到环境变量

文章目录 创建一个tab&#xff0c;写上接口地址&#xff0c;json类型的参数&#xff0c;点击send&#xff0c;返回成功。 点击Environment&#xff0c;新建dev环境&#xff0c;创建token变量 编写Tests脚本 // 获取响应的token值 var responseJson pm.response?.json()…

《TCP IP网络编程》第三章

2023.7.10 第3章、地址族与数据序列 3.1 分配给套接字的IP地址与端口号 IP 是 Internet Protocol&#xff08;网络协议&#xff09;的简写&#xff0c;是为收发网络数据而分配给计算机的值。端口号并非赋予计算机的值&#xff0c;而是为了区分程序中创建的套接字而分配给套接字…

激活函数 | 神经网络

1 为什么使用激活函数&#xff08;Activation Function&#xff09; 1.数据角度&#xff1a; 由于数据是线性不可分的&#xff0c;如果采用线性化&#xff0c;那么需要复杂的线性组合去逼近问题&#xff0c;因此需要非线性变换对数据分布进行重新映射; 2.线性模型的表达力问题…

python flask server 接收post数据注意

前面写了两篇文章&#xff0c;结果错误不少&#xff0c;经过修正&#xff0c;改了很多错误 1 跨域 加上以下两条 from flask_cors import CORS from flask_cors import cross_origin以下让整个全景跨域 CORS(app, supports_credentialsTrue)2 secret_key 加上secret_key 防…

系列五、RocketMQ集群搭建

一、概览 二、集群特点 2.1、NameServer NameServer是一个几乎无状态节点&#xff0c;可集群部署&#xff0c;节点之间无任何信息同步。 2.2、Broker Broker部署相对复杂&#xff0c;Broker分为Master与Slave&#xff0c;一个Master可以对应多个Slave&#xff0c;但是一个Sla…

客户端是win10远程连接ubuntu后图形化执行程序verdi

一、安装xlaunch 1.1 搜索vcxsrv安装即可 1.2 对vcx进行配置&#xff0c;参考 将ubuntu终端打开的GUI图形界面窗口显示在windows上_heusjh的博客-CSDN博客https://blog.csdn.net/m0_51194302/article/details/128768284#:~:text%E5%B0%86ubuntu%E7%BB%88%E7%AB%AF%E6%89%93%…

天翎MyApps低代码平台案例分享—百川信保安服务综合管理系统

项目背景&#xff1a;百川信&#xff08;北京&#xff09;信息服务有限公司&#xff08;以下简称“百川信”&#xff09;成立于2014年&#xff0c;是一家专注于为安保行业提供高效、全场景、智能化协同办公管理与服务的科技公司。作为国内领先的数字安保解决方案与应用服务提供…

winform去掉最小化后左下角窗口,托盘处理

去掉如图的窗口&#xff1b; public partial class FormZpenSample : Form{public FormZpenSample(){InitializeComponent();#region 托盘处理//隐藏ui this.WindowState FormWindowState.Minimized;//隐藏任务栏区图标this.ShowInTaskbar false;//不显示this.Hide();//图标显…

masm32 链接问题

当我参考资料学习Windows环境下32位汇编时&#xff0c;编译倒没什么问题&#xff0c;可是链接就不对了。 网上也没找到解决办法&#xff0c;经过后来思考了一下&#xff0c;会不会是link.exe这个玩意有问题&#xff1f;比如有多个&#xff1f; 所以使用link的绝对路径试了一下…

使用json-server 模拟后端数据

1. json-server是什么 json-server 是一个 Node 模块&#xff0c;运行 Express 服务器&#xff0c;你可以指定一个 json 文件作为 api 的数据源。 简单的说&#xff0c;它可以模拟小型后台接口&#xff0c;在一个JSON文件中操作数据&#xff0c;是基于的node.js的一个模块。 比…

【MySQL】MySQL分区表详解

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录 分区表介绍表分区的优缺点和限制 分区适用场景分区方式分区策略RANGE分区LIST分区HASH分区KEY分区COLUMNS 分区 常见分区命令是否支持分区创建分区表向分区表添加新的分区删除指定的分区重新组织分…

2 增长渐进阶求解

2 增长渐进阶求解 作者: 赵晓鹏时间限制: 1S章节: 递归与分治 #include<iostream> using namespace std;int main() {cout << "A"<<endl ; cout << "A"<<endl ; cout << "A"<<endl ; cout << …

Linux 学习记录49(QT篇)

Linux 学习记录49(QT篇) 本文目录 Linux 学习记录49(QT篇)一、事件处理机制1. 什么是事件2. 如何处理事件(1. 当事件发生时(2. QObject类的子类 3. 事件处理函数由来4. 鼠标和键盘事件5. 键盘按键示例 二、定时器1. 定时器事件2. 代码实现3. 自制文本闹钟 三、绘制事件&#xf…

Centos7离线模式安装Redis6.2.13详细步骤(rpm方式)

本篇文章主要介绍在CentOS7服务器中安装Redis6.2.13&#xff0c;前提是需要有gcc的环境&#xff0c;那么在此我也会向大家介绍gcc的详细安装过程&#xff0c;参考了很多其它相关博客&#xff0c;但有些博主的文章可能是搬运的&#xff0c;导致我在实操时出现报错&#xff0c;那…

CVE-2023-23752-Joomla权限绕过漏洞研判分析

CVE-2023-23752-Joomla权限绕过漏洞分析 简介 Joomla是一个开源免费的内容管理系统&#xff08;CMS&#xff09;&#xff0c;基于PHP开发。 在其4.0.0版本到4.2.7版本中&#xff0c;存在一处属性覆盖漏洞&#xff0c;导致攻击者可以通过恶意请求绕过权限检查&#xff0c;访问…

Go轻量级线程Goroutine

文章目录 Goroutinegoroutine的创建GPM介绍goroutine调度 道阻且长&#xff0c;行则将至&#xff0c;行而不辍&#xff0c;未来可期&#x1f31f;。人生是一条且漫长且充满荆棘的道路&#xff0c;一路上充斥着各种欲望与诱惑&#xff0c;不断学习&#xff0c;不断修炼&#xff…

第二十一章:用户与权限管理

第二十一章&#xff1a;用户与权限管理 21.1&#xff1a;用户管理 登录MySQL服务器 # 语法 mysql -h hostname|hostIP -P port -u username -p DatabaseName -e "SQL语句"; # -h参数 后面接主机名或者主机IP&#xff0c;hostname为主机&#xff0c;hostIP为主机IP。…

请求响应-简单参数的接受

请求响应 请求&#xff08;HttpServletRequest&#xff09;&#xff1a;获取请求数据响应&#xff08;HttpServletResponse&#xff09;&#xff1a;设置响应数据BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构。客户端只需要浏览器&#xff0c;应用程序的逻…