【排序算法】一、排序概念和直接插入排序(C/C++)

「前言」文章内容是排序算法之直接插入排序的讲解。(所有文章已经分类好,放心食用)

「归属专栏」排序算法

「主页链接」个人主页

「笔者」枫叶先生(fy)

目录

  • 一、排序概念的介绍
  • 二、直接插入排序
    • 2.1 原理
    • 2.2 代码实现(C/C++)
    • 2.3 特性总结

一、排序概念的介绍

排序的概念

  • 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作
  • 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的
  • 内部排序:数据元素全部放在内存中的排序
  • 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内存和外存之间移动数据的排序

常见的排序算法

在这里插入图片描述

二、直接插入排序

2.1 原理

直接插入排序是一种简单直观的排序算法,它的基本思想是将一个元素插入到已经排好序的部分数组中,从而使得数组保持有序。[基于数组(顺序表)的结构进行排序)]

例如,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序。按照此法对所有元素进行插入,直到整个序列有序

具体步骤如下:

  1. 从第一个元素开始,该元素可以认为已经被排序;
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2~5

例如,对数组[4, 2, 5, 1, 6, 3]进行排序,使用直接插入排序,如下:(升序)
在这里插入图片描述
动图演示:(数据不和上面相同)
在这里插入图片描述

时间、空间复杂度

  • 时间复杂度最好情况下为O(N),此时待排序列为升序,或者说接近升序
  • 时间复杂度最坏情况下为O(N^2),此时待排序列为逆序,或者说接近逆序
  • 总的来说,直接插入排序的时间复杂度为O(N^2)
  • 在原有的数组上操作,空间复杂度为O(1)

2.2 代码实现(C/C++)

C语言代码如下:(升序)

// 直接插入排序
void InsertSort(int* arr, int n) // arr:需要排序的数组; n:数组的大小
{for (int i = 0; i < n-1; ++i) // 达到n-1时,数组已经有序,无需再遍历最后一次,避免多余的循环{// [0, end]有序,把end+1位置的值插入,保持有序int end = i; // 记录有序序列的最后一个下标int tmp = arr[end + 1]; // 保存等待插入的值while (end >= 0) {if (arr[end] > tmp) // arr[end]比要插入的数大,向后移动{arr[end + 1] = arr[end]; // 向后移,进行覆盖,tmp已经保存被覆盖的值--end; // 迭代}else // arr[end]比要插入的数小,已有序,跳出循环{break;}}arr[end + 1] = tmp; // 进行插入}
}

C++代码:(升序)

// 直接插入排序
void InsertSort(vector<int>& arr)
{int n = arr.size();for (int i = 0; i < n - 1; ++i) // 达到n-1时,数组已经有序,无需再遍历最后一次,避免多余的循环{// [0, end]有序,把end+1位置的值插入,保持有序int end = i; // 记录有序序列的最后一个下标int tmp = arr[end + 1]; // 保存等待插入的值while (end >= 0){if (arr[end] > tmp) // arr[end]比要插入的数大,向后移动{arr[end + 1] = arr[end]; // 向后移,进行覆盖,tmp已经保存被覆盖的值--end; // 迭代}else // arr[end]比要插入的数小,已有序,跳出循环{break;}}arr[end + 1] = tmp; // 进行插入}
}

2.3 特性总结

直接插入排序的特性总结

  • 元素集合越接近有序,直接插入排序算法的时间效率越高
  • 时间复杂度:O(N^2)
  • 空间复杂度:O(1),它是一种稳定的排序算法
  • 稳定性:稳定

--------------------- END ----------------------

「 作者 」 枫叶先生
「 更新 」 2024.1.9
「 声明 」 余之才疏学浅,故所撰文疏漏难免,或有谬误或不准确之处,敬请读者批评指正。

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

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

相关文章

Web API乐观锁和悲观锁

在 Web API 中&#xff0c;乐观锁&#xff08;Optimistic Locking&#xff09;和悲观锁&#xff08;Pessimistic Locking&#xff09;是两种常见的并发控制机制。它们的目的都是在多个用户同时访问和修改相同资源时&#xff0c;确保数据的一致性和完整性。 乐观锁 乐观锁的思…

Linux的网络设置

一.查看网络配置 1.查看网络接口信息 - ifconfig ① 直接使用 ifconfig 命令 默认显示活动的网卡 解析&#xff1a; ② ifconfig 具体网卡名称 只显示具体的网卡的信息 ③ ifconfig -a 显示所有的网卡 ④ ifconfig 网卡名称 down 关闭网卡 ifdown 关闭网卡 …

2024年01月微软更新Bug 已解决 !Explorer.EXE 提示:Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。

前倾概要 近期大量出现如上图问题&#xff0c;杀毒&#xff0c;系统急救箱都没反应&#xff0c;罪魁祸首就是微软更新&#xff01; 点击什么都是&#xff1a;Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。 但软件使用正常&#xff0c;还能通过建立…

MATLAB中slist函数用法

目录 语法 说明 示例 显示模型的已排序列表 slist函数的功能是在模拟调试会话期间显示已排序的模块列表。 语法 slist 说明 slist在MATLAB命令窗口中显示根系统以及根系统中的每个非虚拟子系统或引用模型的块的已排序列表。对于根系统、每个非虚拟子系统和每个引用模型&…

linux离线安装git

首先需要有一台有网的linux&#xff0c;下载git源码包 下载地址 Index of /pub/software/scm/git/ 我这里下载的是git-2.9.5.tar.gz&#xff0c;依次执行如下命令进行编译 # 在有网的环境中&#xff0c;编译git&#xff0c;然后打包拿到内网直接用 # 下载git-2.9.5.tar.gz&…

SQL Server 加密 view文本

CREATE VIEW dbo.View_building WITH ENCRYPTION AS SELECT * FROM Building_Temp; GO 注意&#xff1a; 加密後就看不到VIEW文本了&#xff0c;修改 ALTER VIEW dbo.View_building WITH ENCRYPTION AS –修改後的VIEW 文本 GO 或者刪除再新增。 所以&#xff0c;要另備份原V…

【产品应用】一体化伺服电机在管道检测机器人中的应用

一体化伺服电机在管道检测机器人的应用正日益受到关注。管道检测机器人是一种能够在管道内部进行检测和维护的智能化设备&#xff0c;它可以检测管道的内部结构、泄漏、腐蚀等问题&#xff0c;以确保管道的安全和稳定运行。而一体化伺服电机作为机器人的动力源&#xff0c;对于…

20230403读书笔记|《苏轼词集》——试问岭南应不好,此心安处是吾乡

20230403读书笔记|《苏轼词集》——试问岭南应不好&#xff0c;此心安处是吾乡 导读卷一卷二卷三 在书架里加了好几本苏轼词集&#xff0c;很多词是重复的&#xff0c;但这并不影响多读几本&#xff0c;苏轼的词豪迈大气&#xff0c;豁达爽朗&#xff0c;蛮值得一读的。有不少都…

中小型家具制造业使用制造管理MES系统应该注意什么?

随着人们生活水平变高&#xff0c;人们对家具的要求也在提高。为了应对越来越高的要求&#xff0c;企业开始寻找更有效的方法&#xff0c;其中就包括mes系统&#xff0c;那么中小型家具企业在使用mes的过程中应该注意什么呢&#xff1f; 第一&#xff0c;要考虑选择什么样的mes…

Pycharm直接从github上下载项目(社区版)

Pycharm直接从github上下载项目&#xff08;社区版&#xff09; 1.在pycharm上关联github账号2.导航栏——Git——clone 1.在pycharm上关联github账号 2.导航栏——Git——clone

【数据结构】二叉树的链式实现

树是数据结构中非常重要的一种&#xff0c;在计算机的各方个面都有他的身影 此篇文章主要介绍二叉树的基本操作 目录 二叉树的定义&#xff1a;二叉树的创建&#xff1a;二叉树的遍历&#xff1a;前序遍历&#xff1a;中序遍历&#xff1a;后序遍历&#xff1a;层序遍历&#…

梯度提升决策树(Gradient Boosting Decision Trees,GBDT)

梯度提升决策树&#xff08;Gradient Boosting Decision Trees&#xff0c;GBDT&#xff09; ​ 提升树是以分类树或回归树为基本分类器的提升方法。 提升树被认为是统计学习 中性能最好的方法之一。 ​ 提升方法实际采用加法模型(即基函数的线性组合)与前向分步算法。 以决策…

Mendeley Word 文献引用

这里写目录标题 1. 下载Mendeley 并插入到Word1.1 下载安装1.2 在Word 中添加Mendeley 插件文献引用相关 1. 下载Mendeley 并插入到Word 1.1 下载安装 Mendeley 官网下载 1.2 在Word 中添加Mendeley 插件 打开 Mendeley&#xff0c;点击 Tools —>Install Mendeley Cite…

AWS云用户创建

问题 需要给工友创建AWS云的用户&#xff0c;这里假设使用分配给自己AWS开发者IAM账号&#xff0c;给别人创建aws IAM账号。 登录系统 打开页面&#xff1a;https://xxx.signin.aws.amazon.com/console&#xff0c;使用分配的开发者账号登录。如下图&#xff1a; 创建用户…

资源分享栏目一直会更新

文章目录 1. [南京大学IT侠文档共享计划](https://www.yuque.com/itxia)2. [洛谷OJ平台](https://www.luogu.com.cn/)3. [ChatGPT](chat.openai.com)4. [stackoverflow](stackoverflow.com) 1. 南京大学IT侠文档共享计划 可以解决大部分的电脑问题&#xff0c;如遇到Windows 系…

vue组件开发

1. 组件开发介绍 ① 组件化&#xff1a;一个页面可以拆分成一个个组件&#xff0c;每个组件有着自己独立的结构、样式、行为。 好处&#xff1a;便于维护&#xff0c;利于复用 → 提升开发效率。 组件分类&#xff1a;普通组件、根组件。② 根组件&#xff08;App.vue&#xf…

Hive之set参数大全-5

I 限制外部表数据插入 set hive.insert.into.external.tablestrue;在Apache Hive中&#xff0c;通过INSERT INTO语句向外部表&#xff08;External Table&#xff09;插入数据时&#xff0c;有一些注意事项和限制。外部表是Hive中的一种特殊表&#xff0c;它与Hive管理的存储…

探索Redis特殊数据结构:HyperLogLog在基数统计中的应用

一、概述 Redis官方提供了多种数据类型&#xff0c;除了常见的String、Hash、List、Set、zSet之外&#xff0c;还包括Stream、Geospatial、Bitmaps、Bitfields、Probabilistic&#xff08;HyperLogLog、Bloom filter、Cuckoo filter、t-digest、Top-K、Count-min sketch、Confi…

Mariadb和mysql数据库的区别和相同之处

目 录 一、maridb 和mysql在linux系统中广泛应用 二、MySQL数据库 三、MariaDB数据库 四、MariaDB和MySQL有哪些相同点 五、MariaDB和MySQL的不同点 一、mariadb 和mysql在linux系统中广泛应用 用linux&#xff08;包括centos和Ubuntu&#xff09;的都知道&a…

使用Trie数据结构实现搜索自动完成功能

本文旨在讨论使用 Java 的搜索自动完成的低级实现&#xff0c;将Trie在用例中使用数据结构。 这是一个示例TrieNode类&#xff1a; class TrieNode{ Map<Character,TrieNode> children; boolean isEndOfWord; TrieNode(){ children new HashMap<>(); isEndOfWor…