排序算法---插入排序

news2024/11/18 1:47:40

插入排序是一种简单的排序算法,一般又称为直接插入排序。插入排序的思想与选择排序有些相似,即在原数组上将数组分为两个部分:已排列好的有序数组待排列数组,选择排序强调的是“选择”,而插入排序强调的是”插入“(类似生活中,整理扑克牌动作)。下面我们将详细的介绍一下插入排序的思想和具体代码实现。

算法思想

插入排序的思想大致如下所示:

  1. 从第一个元素开始,默认为该元素就是已排好的有序数组(因为只有一个元素的数组,本身就可以认为其是有序的)。

在这里插入图片描述

  1. 取出下一个元素(待排列数组中的第一个元素),在已经排好的有序数组中从后往前进行比较,找到其应该插入的位置,将其“插入“对应位置。(具体的实现过程如下:取出的目标元素从已排好的有序数组的最后一位开始扫描,依次与其进行比较,如果大于目标元素,则交换两者的位置,当遇到小于或等于则停止)

在这里插入图片描述

  1. 重复2的步骤,直到待排列数组为空。

在这里插入图片描述

代码实现

#include <algorithm>
#include <iostream>
#include <vector>

template <typename T>
std::vector<T> insertionSort(std::vector<T> arr) {
  for (int i = 1; i < arr.size(); ++i) {  // 默认第一个元素即为已排好数组
    // 写法1
    /*for (int j = i; j > 0; --j) {
      if (arr[j] < arr[j - 1])
        std::swap(arr[j], arr[j - 1]);
      else
        break;
    }*/

    // 写法2
    /*for (int j = i; j > 0 && arr[j] < arr[j - 1]; --j)
      std::swap(arr[j], arr[j - 1]);*/

    // 写法3
    T t = arr[i];
    int j;
    for (j = i; j > 0 && arr[j - 1] > t; --j) arr[j] = arr[j - 1];
    arr[j] = t;
  }

  return arr;
}

int main() {
  std::vector<int> arr = {3, 5, 2, 1, 4};
  std::vector<int> sorted = insertionSort(arr);
  for (int num : sorted) {
    std::cout << num << " ";
  }
  std::cout << std::endl;
  return 0;
}

复杂度

  • 空间复杂度:插入排序在排序过程中不涉及额外的其它空间,因此空间复杂度为 O ( 1 ) O(1) O(1)
  • 时间复杂度:在完全有序的情况下,插入时每个目标元素都要与已排好的有序数组的末尾元素比较一次,所以时间复杂度为 O ( n ) O(n) O(n);对于完全逆序的情况下,插入时目标元素要与已排好的有序数组的每一个元素都要比较一次,因此时间复杂度为 O ( n 2 ) O(n^2) O(n2)

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

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

相关文章

【Excel统计分析插件】上海道宁为您提供统计分析、数据可视化和建模软件——Analyse-it

Analyse-it是Microsoft Excel中的 统计分析插件 它为Microsoft Excel带来了 易于使用的统计软件 Analyse-it在软件中 引入了一些新的创新统计分析 Analyse-it与 许多Excel加载项开发人员不同 使用完善的软件开发和QA实践 包括单元/集成/系统测试 敏捷开发、代码审查 …

【JavaScript面向对象】

JavaScript面向对象 1 本节目标2 面向对象编程介绍2.1 两大编程思想2.2 面向过程编程POP2.3 面向对象编程OOP2.4 面向过程和面向对象的对比 3 ES6中的类和对象3.1 对象3.2 类class3.3 创建类3.4 类constructor构造函数3.5 类添加方法3.6 三个注意点 4 类的继承4.1 继承4.2 supe…

matlab 点云采样相关操作-源码复制粘贴即可

1.随机采样一个百分点的随机抽样 clc; clear; close all; % clear everything% Import point cloud pc pointCloud(Lion.xyz);% Plot all points pc.plot; % points are colored by z coordinate title(All Points, Color, w); view(0,0); snapnow;% Select randomly 5 perce…

FL Studio21免费吗?怎么下载最新中文版本?

FL Studio中文版已上线&#xff0c;自20.8版起已支持简体中文。推荐使用Windows 10系统安装&#xff0c; Windows 7系统设置FL Studio语言为中文时若出现乱码&#xff0c;可以将Win10系统中的“微软雅黑”字体复制并安装进Win7系统电脑中&#xff01;FL Studio支持什么格式的插…

【软考数据库】第四章 操作系统知识

目录 4.1 进程管理 4.1.1 操作系统概述 4.1.2 进程组成和状态 4.1.3 前趋图 4.1.4 进程同步与互斥 4.1.5 进程调度 4.1.6 死锁 4.1.7 线程 4.2 存储管理 4.2.1 分区存储管理 4.2.3 分页存储管理 4.2.…

进程与线程:同步和互斥

进程与线程&#xff1a;同步&互斥 同步&互斥的概念 ​ 进程具有异步性的特征。异步性是指各并发进程执行的进程的以各自独立的&#xff0c;不可预知的速度向前推进 同步 ​ 同步 亦称为直接制约关系&#xff0c;它是指为完成某种任务而建立的两个或多个进程&#xf…

虚拟主机解压/压缩功能说明

使用帮助说明 主机控制面板上点击文件管理&#xff0c;进入目录。 一、解压 windows操作系统: 鼠标移动到压缩文件&#xff0c;点击“解压” Linux操作系统&#xff1a; 压缩文件后点击解压按钮。 注意linux系统不支持rar在线解压&#xff0c;rar改名为zip也不能解压&…

JVM 调优

大部分的情况都是由于企业内部代码逻辑不合理导致。 JVM内部性能优化 栈上分配 方法内联 JVM的自适应调整 JVM改错 大并发内存不足OOM 内存泄漏GC频繁CPU飙升 JVM的调优的原则是让你各项指标尽可能的利用到你硬件的性能瓶颈。 JVM的性能优化可以分为代码层面和非代码层面。…

数据库系统工程师——第五章 网络基础知识

文章目录 &#x1f4c2; 第五章、网络基础知识 &#x1f4c1; 5.1 计算机网络概述 &#x1f4d6; 5.1.1 计算机网络的概念 &#x1f4d6; 5.1.2 计算机网络的分类 &#x1f4d6; 5.1.3 网络的拓扑结构 &#x1f4c1; 5.2 网络硬件基础 &#x1f4d6; 5.2.1 网络设备 &…

Linux 文件内容相关命令使用汇总

Linux操作系统有很多强大的文件内容相关命令&#xff0c;这些命令可以让您查看、分析和编辑文件。其中&#xff0c;最基本和常用的命令包括cat、more、less和head/tail等。除了这些基本命令之外&#xff0c;grep和find命令也是文件搜索和过滤方面的有力工具。 前言 我们这篇主…

UM2080F32 低功耗32 位 Sub1GHz 无线SOC收发器芯片

产品描述 UM2080F32 是广芯微电子&#xff08;广州&#xff09;股份有限公司研制的基于 ARM Cortex M0 内核的超低功 耗、高性能的、单片集成 (G)FSK/OOK 无线收发机的 32 位 S o C 芯片。 UM2080F32 工作于 200MHz~960MHz 范围内&#xff0c;支持灵活可设的数据包格式&#xf…

危险试探,产品经理赋予AI人格来打造品牌忠诚度

图片来源&#xff1a;由无界 AI工具生成 你可能不会相信&#xff0c;你的手机很可能变成你的虚拟情人&#xff0c;升级情人需要升级手机&#xff0c;而你从此再也不想换其他品牌手机。 AI时代&#xff0c;赋予产品以人格&#xff0c;让用户爱上产品&#xff0c;这或许是接下来产…

Python整个颜色小网站,给刚刚失恋的他.........

一些过场剧情: 死党一直暗恋校花&#xff0c;但是校花对他印象也不差&#xff0c; 就是死党一直太怂了&#xff0c;不敢去找校花&#xff0c; 直到昨天看到校花登上了校董儿子的豪车&#xff0c; 死党终于彻底死心&#xff0c;大醉一场&#xff0c;作为他的兄弟&#xff0c…

井电双控智能取水计量设备-井电双控遥测终端机

井电双控遥测终端机/井电双控智能取水计量设备&#xff08;MGTR-W4122C&#xff09;是针对取水计量控制系统开发智能终端产品。集预收费、流量监测、电量监测、余额提醒、欠费停机、无线传输、远程控制等多种功能于一体&#xff0c;并可根据项目需求选择实体IC卡和APP电子卡取水…

【JavaEE】从收发消息的角度理解 TCP/IP 五层网络模型的封装与分用

文章目录 1 为什么需要分层&#xff1f;2 TCP/IP 五层网络模型3 数据的封装&#xff08;发送消息为例&#xff09;4 数据的分用&#xff08;接收消息为例&#xff09;5 实际网络环境上的封装与分用写在最后 1 为什么需要分层&#xff1f; 你问我为啥需要分层&#xff1f;那必然…

python+vue 健康体检预约管理系统

该专门体检预约管理系统包括会员和管理员。其主要功能包括个人中心、会员管理、体检服务管理、类型管理、订单信息管理、取消订单管理、 体检报告管理、通知信息管理、交流论坛、系统管理等功能。 目 录 一、绪论 1 1.1研发背景和意义 2 1.2 国内研究动态 3 1.3论文主…

US-DAT2-F、US-DAT2-A比例放大器接线

多路控制阀比例放大器接线端子定义&#xff1a; 序号 端口 名称 1 CMD1 1阀指令 2 CMD1- 1阀指令- 5 RS485_A - 6 RS485_B - 7 VREF_10V 参考电压10V 8 VREF_0V 参考电压0V 9 VAL1_A 1阀电磁铁A 10 VAL1_AB- 1阀电磁铁AB- 11 VAL1_B 1阀电磁铁B 12 PWR 电源 13 PWR…

Unreal5 实现角色动画重定向

解决问题&#xff1a; 有时候有的角色动画想用到另外的角色身上&#xff0c;不能直接用怎么办&#xff1f; 解决方案&#xff1a; 使用重定向 实现方式&#xff1a; 在资产里面创建IK绑定 在列表中选中需要绑定的骨骼网格体 需要创建两个&#xff0c;我这里是女人需要使用男…

【社区图书馆】PyTorch高级机器学习实战

PyTorch高级机器学习实战 作者&#xff1a;王宇龙&#xff0c;清华大学计算机博士&#xff0c;大型互联网公司算法专家&#xff0c;在国际学术会议及期刊发表过多篇论曾出版书籍《PyTorch深度学习入门与实战》&#xff0c;知乎"机器学习”话题优秀回答者。 亮点&#xf…

【Git 入门教程】第三节、Git的分支和合并

Git的分支和合并是Git中最重要的概念之一。使用Git可以轻松地创建、切换和合并分支&#xff0c;这为团队协作开发提供了极大的便利。在本文中&#xff0c;我们将介绍Git分支的基本概念和操作方式。 一、分支 在Git中&#xff0c;分支是指一个代码库的不同版本。分支允许开发者…