排序算法-----插入排序

目录

前言:

插入排序

 原理图

代码实现

分析总结

二分法插入排序

代码实现


前言:

        嗨嗨^_^,米娜桑,今天我们继续学习排序算法中的插入排序,激不激动,兴不兴奋呢!好了废话不多说,下面请看正文!

插入排序

         插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

 原理图

 初始数组如下所示:

第一次,拿到第一个数字,因为第一个数字不存在顺序,无法进行比较,所以不需要进行相关的操作 第二次,拿到第二个数字 1 ,与前面的数字进行比较,发现6比1大,那么就进行数字交换,如下图所示:

第三次,拿到数字9,发现9,比前面的两个数字都要大,那么就保持位置不变,继续往后看。

 第四次,拿到数字2,此时发现,2比9小,比6小,比1大,那么就把2插入到1和6之间,6和9依次向后移动一位。

第五次,拿到数字4,此时把数字4插入到2和6之间,同样的6和9依次往后移动一位。

第六次,拿到数字8,此时8比9小,那么就插入到9的前面即可,9向后移动一位

第七次,拿到12,发现12比前面已排序好了的数字都要大,那么位置不变。

 第八次,拿到10,此时10比12小,比9大,那么就插入到9和12之间,12向后移动一位。

看,这样就完成了排序了! 

动态图展示 

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>//直接插入
void insert_sort(int* n, int length) {for (int i = 0; i < length; i++) {int temp = n[i];for (int j = i - 1; j >= 0; j--) {if (n[j] > temp) {n[j + 1] = n[j];n[j] = temp;}}}}
int main() {int array[10];srand((unsigned)time(0));for (int i = 0; i < 10; i++) {array[i] = rand() % 20;}for (int i = 0; i < sizeof(array) / sizeof(int); i++) {printf("%d ", array[i]);}printf("\n排序后:");insert_sort(array, sizeof(array) / sizeof(int));for (int i = 0; i < sizeof(array) / sizeof(int); i++) {printf("%d ", array[i]);}
}
//输出结果:
//9 16 13 4 8 12 2 0 7 2
//排序后:0 2 2 4 7 8 9 12 13 16

分析总结

时间复杂度

最好情况就是全部有序,此时只需遍历一次,最好的时间复杂度为O ( n );如果完全逆序的话,那么时间复杂度就会变为O(n^2),直接翻倍。所以时间复杂度为O(n^2) 。

空间复杂度

这里没有去开辟空间,空间是一个常量,所以空间复杂度是O(n).

稳定性 

 遇到相同大小元素过程中,依然是插入到相同元素的前边,相对位置没有发生改变,所以稳定性好。

二分法插入排序

 二分法插入排序是对插入排序的代码优化,整体的实质上还是插入排序,时间复杂度依然是不会改变的O(n^2),当n较大时,总排序码比较次数比直接插入排序的最坏情况要好得多,但比其最好情况要差。同样的,二分法插入排序是稳定的。

 

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
//二分法插入排序
void insert_bin_sort(int *n,int length) {int left, right, mid;for (int i = 1; i < length; i++) {left = 0;right = i - 1;while (left <= right) {mid = (left + right) / 2;if (n[mid] > n[i]) {right = mid - 1;}else{left = mid + 1;}}int temp = n[i];for (int j = i; j > left; j--) {n[j] = n[j - 1];}n[left] = temp;}
}
int main() {int array[10];srand((unsigned)time(0));for (int i = 0; i < 10; i++) {array[i] = rand() % 20;}for (int i = 0; i < sizeof(array) / sizeof(int); i++) {printf("%d ", array[i]);}printf("\n排序后:");insert_bin_sort(array, sizeof(array) / sizeof(int));for (int i = 0; i < sizeof(array) / sizeof(int); i++) {printf("%d ", array[i]);}
}
//输出结果:
//15 0 15 3 5 7 9 6 12 14
//排序后:0 3 5 6 7 9 12 14 15 15

以上就是今天的全部内容了,我们下一期再见!

分享一张壁纸: 

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

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

相关文章

制作ubuntu18.04系统盘

文章目录 前言一、下载ubuntu18.04的iso文件二、制作u盘系统盘2、使用ultra来制作系统盘2.1、加载iso2.2、制作系统盘 前言 安装ubuntu18.04系统 一、下载ubuntu18.04的iso文件 打开下面的网址&#xff0c;找到自己需要的iso文件 https://releases.ubuntu.com/二、制作u盘系…

国家网络安全周 | 金融日,一起 get金融行业数据安全

2023国家网络安全宣传周 热度一直在持续&#xff01; 9月15日是国家网络安全宣传金融日。 目前随着国际形势愈发严峻&#xff0c;金融机构基础设施的全面数字化升级&#xff0c;带来了全新的安全问题。数据安全不单是技术问题&#xff0c;更是已经成为一个关系社会稳定发展的…

开源库源码分析:Okhttp源码分析(一)

开源库源码分析&#xff1a;OkHttp源码分析 导言 接下来就要开始分析一些常用开源库的源码了&#xff0c;作为最常用的网络请求库&#xff0c;OkHttp以其强大的功能深受Android开发者的喜爱&#xff08;比如说我&#xff09;&#xff0c;还有对该库进行二次封装而成的热门库&a…

无涯教程-JavaScript - COLUMNS函数

描述 COLUMNS函数返回数组或引用中的列数。 语法 COLUMNS (array)争论 Argument描述Required/OptionalarrayAn array or array formula, or a reference to a range of cells for which you want the number of Columns.Required Notes COLUMNS(1:1)返回Excel中的列数,即…

20230912在ubuntu18.04下使用pigz来提高tar命令压缩解压缩的速度

20230912在ubuntu18.04下使用pigz来提高tar命令压缩解压缩的速度 2023/9/15 22:19 https://blog.csdn.net/wb4916/article/details/128447298 20221226编译Toybrick的TB-RK3588X开发板的Android12系统2-SDK预处理 4、单线程压缩。 建议使用&#xff1a;pigz多线程压缩&#xf…

极光笔记 | 推送服务数据中心选择:合规性与传输效率的双重考量

随着全球化进程的深入&#xff0c;跨境数据传输与存储问题已经变得愈发重要。推送服务的数据中心节点选择不仅关乎数据访问速度和用户体验&#xff0c;同时也直接牵扯到数据合规性和安全保障。EngageLab Push深知这一点&#xff0c;为了满足更多国际客户和全球用户触达需求&…

sqlserver存储过程报错:当前事务无法提交,而且无法支持写入日志文件的操作。请回滚该事务。

现象&#xff1a; 系统出现异常&#xff0c;手动执行过程提示如上。 问题排查&#xff1a; 1.直接执行的过程事务挂起&#xff08;排除&#xff09; 2.重启数据库实例&#xff08;重启后无效&#xff09; 3.过程中套用过程&#xff0c;套用的过程中使用事务&#xff0c;因为…

sql存储引擎

-- 查询建表语句 --可以查看引擎 show create table account; -- 可以看到默认引擎 InnoDB ENGINEInnoDB -- 查看当前数据库支持得存储引擎 show engines ; # InnoDB 默认 存储引擎 # MyISAM sql早期默认 存储引擎 # MEMORY 存储在内存中 用来做临时表和缓存 存储引擎 …

伺服取料机构控制

伺服运动控制系统相关介绍大家可以查看运动控制专栏&#xff0c;这篇文章主要讨论常用的伺服取料机构的控制问题。常用运动控制文章链接如下&#xff1a; EtherCAT总线运动控制学习笔记&#xff08;RXXW_Dor&#xff09;_ethercat控制字_RXXW_Dor的博客-CSDN博客说到总线控制&…

管理方法论:4. 一对一沟通——了解真实情况

团队人越多&#xff0c;管理者了解真实情况就越困难&#xff0c;为什么&#xff1f; 缺乏安静的、可以专注于沟通的环境。有些话不能跟太多人说&#xff0c;尤其是负面的想法和意见。有些人本来就内向、被动&#xff0c;其他人说话时&#xff0c;自己往往习惯于听&#xff0c;…

ESP32-BOX的组件配置添加核心部分详细介绍

前言 &#xff08;1&#xff09;为了方便开发&#xff0c;ESP32提供了组件库方便用户进行二次开发。 github仓库&#xff1b;gitee仓库 &#xff08;2&#xff09;在学习本章之前最好有CMake或者Makefile的基础&#xff0c;如果没有也不要慌&#xff0c;有的话最好。 &#xff…

闲鱼自动化软件——筛选/发送系统 V22已经测试完毕

更新 因为闲鱼版本更新&#xff0c;以及闲鱼整个程序维护记录&#xff0c;又增加了一些优化和提升的代码&#xff0c;所以又一次在整体上更新了一版闲鱼的此款软件。 主要更新点&#xff1a; 1、添加显示自定义按钮&#xff0c;可以自动显示最新数据&#xff0c;也可以手动翻…