排序算法——直接插入排序

news2025/1/15 6:39:14

直接插入排序

基本思想

  • 直接插入排序是一种简单明了的插入排序法,其基本思想是:把待排序的数据按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有数据插入完为止。

  • 在现实生活中,我们玩扑克对牌进行排序就运用了这种思想。

    在这里插入图片描述

整体插入思想

统一使用升序

  • 当插入第(i >= 1)个元素时,前面的array[0], array[1], ……, array[i - 1]已经有序,此时用array[i]的值与array[i - 1], array[i - 2],……的值顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移。

  • 如对数组{2, 5, 4, 6, 8, 7, 1}进行升序排序

    在这里插入图片描述

代码实现

  • 我们假设数组中[0,end]的数据已经有序,要将nums[end + 1]这个元素插入到[0,end]中,使[0,end + 1]也有序

  • 因为可能要进行数据后移的操作,为防止nums[end + 1]被覆盖而无法得到其值,要事先用临时变量保存

    int end;
    int temp = nums[end + 1];	
    
  • 运用插入排序的思想,将nums[end + 1](即temp)从后往前依次与有序的元素进行比较,满足条件就插入

    while (end >= 0)
    {
        /*
        	如果后面的数比前面的小,那就将前面的数后移
        	继续将后面的数与更前面的数(即更小的数)比较
        */
        if (temp < nums[end])
        {
            nums[end + 1] = nums[end];
            end--;
        }
        /*
        	否则,如果后面的数比前面的大
        	那么满足升序条件,将temp插入到nums[end]的后面
        */
        else
            nums[end + 1] = temp;
    }
    
  • 但是,上面这段代码还是存在一个小小的bug,即如果我们要插入的元素temp比有序序列的第一个元素nums[0]还要小,那么执行完 nums[end + 1] = nums[end];end--;这一操作后,end就等于-1了,而循环的条件是end >= 0,无法进入循环,end[0]这一位置也无法被赋值,因此,我们要进行改进:

    while (end >= 0)
    {
        if (temp < nums[end])
        {
            nums[end + 1] = nums[end];
            end--;
        }
        
        /*
        	如果后面的数比前面的大
        	那么满足升序条件,直接退出循环
        */
        else
            break;
    }
    
    //将(end >= 0 && temp > nums[end])和 (end == -1)这两种情况整合到一起
    nums[end + 1] = temp;
    
  • 设待排序数组有numsSize个元素,因此要使数组有序,就要用一层for循环来分别判断数组的每个值是否处于正确的位置。

    //为防止数组越界,i的最大值为numsSize - 2
    for (int i = 0; i < numsSize - 1; i++)
    {
        int end = i;
    	int temp = nums[end + 1];
        …………
    }
    

实现代码

void InsertSort(int* nums, int numsSize)
{
    //为防止数组越界,i的最大值为numsSize - 2
	for (int i = 0; i < numsSize - 1; i++)
	{
		/*
			假设[0,end]已经有序
			要将nums[end + 1]这个元素插入到[0,end]中,使[0,end + 1]也有序
		*/
		int end = i;
		int temp = nums[end + 1];	//因为可能要进行数据后移的操作,为防止nums[end + 1]被覆盖而无法得到其值,要事先用临时变量保存	
        
		while (end >= 0)
        {
            if (temp < nums[end])
            {
                nums[end + 1] = nums[end];
                end--;
            }

            /*
                如果后面的数比前面的大
                那么满足升序条件,直接退出循环
            */
            else
                break;
        }

        //将(end >= 0 && temp > nums[end])和 (end == -1)这两种情况整合到一起
        nums[end + 1] = temp;
    }
}

时间复杂度

统一为升序排序

  • 最好的情况:最好的情况就是数组已经升序有序,只有最外面一层for循环遍历一次数组,里面的while循环每一次都是直接退出,因此最好的情况时间复杂度为O(N)
  • 最坏的情况:最坏的情况就是数组是降序排序,里面while循环的时间复杂度为O(N),因此最坏情况下,时间复杂度为O(N2)
  • 综上,直接插入法的时间复杂度为O(N2)

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

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

相关文章

开源、易扩展、方便集成的Web绘图工具(流程图、架构图、组态、SCADA、大屏)

乐吾乐2D可视化Meta2d.js是一个基于typescript canvas 实现的开源在线绘图软件。采用引擎 图形库中间件的思路能够方便、快速的扩展、集成到前端项目。 集实时数据展示、动态交互、数据管理等一体的全功能可视化平台。帮助物联网、工业互联网、电力能源、水利工程、智慧农业…

【unity之c#】所以迭代器的原理知识你还清楚吗?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

day46-动态规划8-单词拆分问题

139.单词拆分-完全背包问题区分求组合数和排列数 本题可以使用回溯算法进行暴力搜索&#xff0c;但是如何使用动态规划的思路进行求解呢。将字符串可以理解成一个容器&#xff0c;将单词可以当成物品&#xff0c;那么此时问题转化成利用物品能否装满容器的问题。这个时候由于返…

chatgpt赋能python:Python列表框-理解列表框的功能和用途

Python列表框 -理解列表框的功能和用途 列表框可以说是Python编程中最常用的控件之一。列表框用于在桌面应用程序中显示和管理数据。与其他编程语言一样&#xff0c;Python编程语言提供了许多列表框控件&#xff0c;可以使用它们来管理和显示各种数据。 列表框是一种视觉化的…

软件工程导论(5)软件编码测试与维护

一、软件编程 2.1良好的编程习惯 变量命名有意义并且使用统一的命名规则 编写自文档代码&#xff08;序言性注释 or 行内注释&#xff09; 提前进行可维护性考量&#xff08;可以用常量的方式存在的数值最好以变量的方式存在&#xff09; 良好的视觉安排可以提高代码的可读性(…

【服务器】零基础搭建私有云盘并内网穿透远程访问

文章目录 摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 转载自cpolar极点云的文章&#xff1a;使用Nextcl…

Hx711称重模块+STM32+CubeMX

文章目录 一、模块和接线二、CubeMX配置1.时钟及sys2.IO口1&#xff09;数据线DT设置为Input2&#xff09;时钟线SCK设置为Output 3.串口4.后续配置 三、程序1.main.c2.hx711.c3.hx711.h4.串口重定向 总结参考文章 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例…

【消息中间件】比较Redis,Kafka和RabbitMQ

对微服务使用异步通信时&#xff0c;通常使用消息代理。代理确保不同微服务之间的通信可靠且稳定&#xff0c;消息在系统内得到管理和监控&#xff0c;并且消息不会丢失。您可以从几个消息代理中进行选择&#xff0c;它们的规模和数据功能各不相同。这篇博文将比较三种最受欢迎…

云服务器CPU内存/带宽配置怎么选择?

云服务器配置怎么选择&#xff1f;个人如何选择&#xff1f;企业怎么选择云服务器配置&#xff1f;腾讯云服务器CPU内存、带宽和系统盘怎么选择合适&#xff1f;个人用户可以选择轻量应用服务器&#xff0c;企业用户可以选择云服务器CVM&#xff0c;企业用户可以选择标准型S5云…

5.1 树和二叉树的定义

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 5.1.1 树的定义 我的理解&#xff1a; 在计算机科学中&#xff0c;树是一种非线性数据结构&#xff0c;由节点&#xff08;或称为顶点&#xff09;和边…

ChatGPT国内镜像网站大盘点(国内可用免费GPT-3.5或GPT-4镜像站点)

目录 方法1&#xff1a;使用灵动Ai Chat网页版 方法2&#xff1a;使用AI CHATGPT 公益站 方法3&#xff1a;使用Chat8 方法4&#xff1a;使用https://steamship.com 方法5&#xff1a;使用AI文本工具站 方法6&#xff1a;使用AIDuTu 很多网友想要国内可用免费ChatGPT镜像站…

【AI实战】开源且可商用的 40B 大语言模型 Falcon 40B

【AI实战】开源且可商用的 40B 大语言模型 Falcon 40B Falcon 40B 介绍开源地址Falcon 40B 的测评开源协议 Falcon 40B 介绍 官网 https://www.tii.ae/news/uaes-technology-innovation-institute-launches-open-source-falcon-40b-large-language-model Abu Dhabi-UAE: 25 Ma…

spring cloud搭建(hystrix)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

安装指定版本docker [centos]

在安装k8s时&#xff0c;对其docker版本有要求&#xff0c;因为在v1.4后对docker不再支持。在安装v1.36版本时&#xff0c;需要提前安装对应版本的docker&#xff0c;这里安装20.10版本 一 先卸载原来安装的docker yum remove docker-ce docker-ce-cli containerd.io 再删除对…

vivado中的Video timing controller IP核参数计算方法

一、参数的计算 直入正题&#xff0c;已知某一1024*600的LCD屏幕&#xff0c;屏幕参数大致如下&#xff1a; 如何设置IP核配置界面的参数呢&#xff1f; 细调参数几乎用不到&#xff0c;我们主要说一下水平设置和垂直设置的8个参数如何配置。取LCD屏幕的典型值作为参考值&#…

自动驾驶之行泊一体

行泊一体技术是一种集成了自动泊车和无人驾驶技术的新型汽车技术,该技术可以使汽车更加智能化和自动化,提高驾驶的安全性和便捷性。从芯片和BEV技术门槛方面来看,我们可以更好地理解这项技术的优势和挑战。 一、芯片限制 实现行泊一体技术需要依靠一些关键的芯片技术,其…

谷歌浏览器Software Reporter Tool长时间占用CPU解决办法

如下图所示&#xff0c;大家是否在使用谷歌浏览器的过程中发现CPU风扇狂转&#xff0c;打开任务管理器发现一个名为software_reporter_tool.exe的软件占用了一半的CPU资源&#xff01;这简直不能忍&#xff0c;按照下面教程&#xff0c;可以解决这个令人苦恼的问题。 什么是Sof…

【LeetCode】693. 交替位二进制数

693. 交替位二进制数&#xff08;简单&#xff09; 方法一 思路 如果一个数的二进制表示总是 0、1 交替出现&#xff0c;那么这个数字可能有两种表示情况&#xff0c;...101010 或 ...010101 &#xff0c;即对应最低位从 0 或 1 开始的两种情况。 因此&#xff0c;我们先确定…

港科夜闻|香港科大出席一流大学建设系列研讨会-2022暨中国大学校长联谊会...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大出席一流大学建设系列研讨会—2022暨中国大学校长联谊会。5月25日至26日&#xff0c;香港科技大学副校长汪扬教授出席由中国科学技术大学主办的一流大学建设系列研讨会—2022暨中国大学校长联谊会。参会代表来自…

【SpringCloud】SpringAMQP总结

文章目录 1、AMQP2、基本消息模型队列3、WorkQueue模型4、发布订阅模型5、发布订阅-Fanout Exchange6、发布订阅-DirectExchange7、发布订阅-TopicExchange8、消息转换器 1、AMQP Advanced Message Queuing Protocol&#xff0c;高级消息队列协议。是用于在应用程序之间传递业务…