图解,C语言数据结构,插入排序

之前写过的排序文章,放上链接给大家看看。

C语言,谁都能看得懂的归并排序

高中新生开学,需要进行军训,军训的时候,教官需要大家把按高到低排队排好。

先随机找到一个比较帅的男生做排头。

然后第二个人过来跟这个男生比身高,如果比第一个高,就排到左边,要不就排到右边。

然后第三个人过来了,他需要在原来的两个人中找到自己的位置。

……

经过把所有的人插入原来的序列,就完成了学生的身高排序。

—— 定义

插入排序顾名思义就是把未排序的数字插入到已经排序的序列的正确位置。

插入排序在很多文章中也会写作直接插入排序。

—— 用图片来举例子

比如我们需要排序这几个数字

我们首先拿出第一个数字6。

然后我们取第二个数字和第一个数字6进行排序,6被认为是已经排序好的数列,因为它就只有一个数字,当然是排序好的了。

5和6排序后,可以得到新的数列

前面两个已经是排序好的序列,再拿第三个序列和前面的序列比较。

然后新排序的序列会变成这样

后面的数字都会依次插入前面已经排序好的序列,得到一个新的排序好的序列。

整个过程如下图

—— 插入排序是否是稳定的排序算法?

什么是稳定排序?

如果两个位置 A[j] == A[k] 相等,我们的排序算法不会改变 A[j] 和 A[k]的位置,这样的排序算法就是稳定的。

比如下面的序列,我们把数字5插入到原来的序列中,但是原来的序列中也有一个数字5,我们不改变原来数字的位置,就说明是稳定的排序。

—— 代码实现

#include   <stdio.h>void insert_sort(int arr[], int n)
{int i,j,temp;/*从第一个位置开始,1~n-1,依次和前面的数据比较*/for (i = 1; i < n; i++){/*保存要插入的值*/temp = arr[i];/*找到需要插入数据的位置*/for (j = i - 1; temp < arr[j] && j >= 0; --j){/*把j位置的数据移动到j+1位置,向后移动一位*/arr[j + 1] = arr[j];}/*插入数据*/arr[j + 1] = temp;}
}#define LENGTH 8int main()
{int i,j;int arr[LENGTH] = {6,5,3,1,8,7,2,4};/*排序前*/for(i=0;i<LENGTH;i++)printf("%d ",arr[i]);printf("\n");insert_sort(arr,LENGTH);/*排序后*/for(i=0;i<LENGTH;i++)printf("%d ",arr[i]);printf("\n");return 0;
}

看代码,是从第 1 位置开始做插入排序的,而且比较是从后往前开始比较。

比如第一个位置的数字,需要和第0个位置开始比较。

如果是第3个位置,就需要和第2、1、0这三个位置比较。

—— 代码输出

6 5 3 1 8 7 2 4 
1 2 3 4 5 6 7 8 

加上随机数的代码

#include   <stdio.h>
#include  <stdlib.h>
#include    <time.h>void insert_sort(int arr[], int n)
{int i,j,temp;/*从第一个位置开始,1~n-1,依次和前面的数据比较*/for (i = 1; i < n; i++){/*保存要插入的值*/temp = arr[i];/*找到需要插入数据的位置*/for (j = i - 1; temp < arr[j] && j >= 0; --j){/*把j位置的数据移动到j+1位置,向后移动一位*/arr[j + 1] = arr[j];}/*插入数据*/arr[j + 1] = temp;}
}#define LENGTH 30int main()
{int i,j;int arr[LENGTH] = {6,5,3,1,8,7,2,4};/*随机数设置种子*/srand((unsigned)time(NULL));/*赋值*/for(i=0;i<LENGTH;i++)arr[i] = rand()%100;/*排序前*/for(i=0;i<LENGTH;i++)printf("%d ",arr[i]);printf("\n");insert_sort(arr,LENGTH);/*排序后*/for(i=0;i<LENGTH;i++)printf("%d ",arr[i]);printf("\n");return 0;
}

—— 代码输出

58 90 36 55 5 91 27 56 19 37 69 75 73 24 14 2 40 57 27 86 2 31 6 59 23 92 16 10 62 92 
2 2 5 6 10 14 16 19 23 24 27 27 31 36 37 40 55 56 57 58 59 62 69 73 75 86 90 91 92 92 

—— 算法复杂度

老王带你理解算法复杂度O(1),O(N),O(N^2)

时间复杂度和空间复杂度,一看就懂,面试前必过一遍

两个循环遍历,算法时间复杂度是 O(N^2)


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

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

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

相关文章

十大经典算法 - 转载

十大经典排序算法最强总结&#xff08;含JAVA代码实现&#xff09; 最近几天在研究排序算法&#xff0c;看了很多博客&#xff0c;发现网上有的文章中对排序算法解释的并不是很透彻&#xff0c;而且有很多代码都是错误的&#xff0c;例如有的文章中在“桶排序”算法中对每个桶进…

首个开源 Linux 系统登陆火星,占有率超 Windows,一同登录还有一款安卓手机芯片...

来源| 量子位 作者 | 贾浩楠 萧箫 公众号 QbitAI“确认着陆&#xff01;毅力号安全到达火星表面。”就在昨日凌晨4点55分&#xff0c;美国“毅力号”不经变轨&#xff0c;直接冲入火星大气层&#xff0c;最终成功着陆。“毅力号”成功着陆后&#xff0c;很快传回了首张图片。…

VS2005(c#)项目调试问题解决方案集锦

1.检测到有潜在危险的 Request.Form 值原因: (1)在提交数据的页面或webconfig中没有对validateRequest的属性进行正确的设置 (2)HTML里面写了两个<form>引起解决: 方案一&#xff1a; 在.aspx文件头中加入这句&#xff1a; <% Page validateRequest"false"…

看了这动图,你还会相信眼睛吗?

面对下面这张动图&#xff0c; 你看到的是两个顺时针旋转的黄蓝相间的圆环&#xff0c;在中心箭头的指引下做上下左右运动、扩展、收缩。稍微留神一下&#xff0c;你会发现好像这应该是收到箭头的暗示所产生的幻觉。▲ 圆圈看起来跟着箭头移动和变化为了证实这个错误的起因&…

解剖8051内核如何进行多任务切换

最近在玩新唐单片机&#xff0c;这个跟我之前用的51内核是一样的&#xff0c;然后今天觉得跑下多任务&#xff0c;自己研究了下&#xff0c;跟几个同学还讨论了&#xff0c;发现有些人对切换过程还不是十分明白&#xff0c;所以发个文章出来。直接上代码#include "MS51_16…

java与.net平台之间进行RSA加密验证

RSA加密算法虽然不分平台&#xff0c;标准都是一样的&#xff0c;但是各个平台的实现方式都不尽相同&#xff0c;下面来我来说说java与.net平台之间该如何进行RSA加密验证&#xff0c;即java端加密-》.net端验证和.net端加密-》java端验证。我对RSA算法也只是停留在应用的层面&…

阿莫电子为啥越来越差?

我是在上大学接触到这个论坛的&#xff0c;当时我们创新基地的学长们都注册了这个论坛的账号。记得有一次看见我旁边的学长在浏览一个技术论坛&#xff0c;我就问「这个是什么网站&#xff0c;看起来好牛逼的样子」。我记得他说了一句「阿莫电子你都不知道&#xff0c;你是不是…

使用栈实现中缀表达式转为后缀表达式和后缀表达式的求解

书籍在线网址http://interactivepython.org/runestone/static/pythonds/index.html 中文翻译书籍&#xff1a;https://facert.gitbooks.io/python-data-structure-cn/ 将中缀表达式转换为后缀表达式 中缀表达式&#xff08;上图&#xff0c;一般书写&#xff09;转换为后缀表达…

TQ210 —— 点亮LED

TQ210 —— 点亮LED 1、S5PV210 GPIO硬件简介 1.1、GPIO 【S5PV210有237个多功能IO口&#xff0c;通过设置寄存器确定某个引脚用于输入输出或者其他特殊功能】 GPIO的英文全称为General-PurposeIO ports&#xff0c;也就是通用IO接口。在嵌入式系统中常常有数量众多&#xff0…

拆解镍氢电池充电器,简单的电路设计令人震惊!

上班爱摸鱼&#xff0c;下班爱钓鱼&#xff0c;于是买了一个钓鱼机。不贵&#xff0c;几十块钱&#xff0c;带4条鱼竿。长这样&#xff1a;电池驱动&#xff0c;钓起鱼来乐趣无穷&#xff1a;惊喜的是&#xff0c;钓鱼机自带附赠的电池是可充电的&#xff0c;省下不少买干电池的…

设备底座几个常见固定方式

在运营商我们可以经常发现如下的固定方式&#xff0c;因为设备厂家的不同&#xff0c;以及机房上下走线方式&#xff0c;固定方式也有些差异。可以清楚看见&#xff0c;底座可以靠螺母进行微调使机柜高度&#xff0c;底部还有膨胀螺丝打入地板还有很多机柜是不加微调用的底座&a…

抽35块树莓派新品单片机送给可爱的你们

我是谁~公众号「嵌入式Linux」&#xff0c;深入解析简明扼要直白解释各种技术问题&#xff0c;包括但不局限于Linux、单片机、半导体、Android、C语言等等。号主从事嵌入式软件行业有10余年&#xff0c;建立了10余个技术微信群&#xff0c;整理了很多技术资料&#xff0c;欢迎大…

TQ210——时钟系统

TQ210——时钟系统 1、时钟域 一般来讲&#xff0c; MCU 的主时钟来源主要是外部晶振或外部时钟&#xff0c;比较常见的是 外 部晶振。一般情况&#xff0c;系统内所使用的时钟都是高频率的时钟&#xff0c;外部晶振一般达不到那么高的频率&#xff0c;所以一般使用锁相环电路&…

我的文章汇总

2018年文章汇总2019年文章汇总2020年文章汇总专辑|Linux文章汇总专辑|程序人生专辑|C语言专辑|Git专辑|安卓系统专辑|嵌入式我的知识小密圈关注公众号&#xff0c;后台回复「1024」获取学习资料网盘链接。欢迎点赞&#xff0c;关注&#xff0c;转发&#xff0c;在看&#xff0c…

webpack-安装

以前配置的gulpfile.js&#xff0c;随着版本的迭代更新&#xff0c;现在已经... 1.安装webpack npm i -g webpack-cli && npm i -g babel-preset-env 2.弹射出窗口&#xff08;我们未安装Git&#xff0c;或者未找到Git path&#xff0c;请配置path&#xff09; 3.再次执…

TQ210——S5PV210中断体系

TQ210——S5PV210中断体系 中断是指 CPU 在执行程序的过程中&#xff0c;遇到异常情况需要处理&#xff0c; CPU停 止当前程序的运行&#xff0c;保存当前程序运行处的必要参数&#xff0c;转去处理这些异常情况&#xff0c; 处理结束后再返回当前程序的间断处&#xff0c;继续…

高通骁龙888开始被Linux内核5.12版正式支持

在Linux 5.12内核合并窗口中&#xff0c;有很多新的硬件开始被支持&#xff0c;其中不乏一些知名产品例如高通骁龙888&#xff0c;除此之外还有一些与ARM平台和设备树有关的代码添加。来自Arnd Bergmann的各种内核拉取请求在周六晚上被合并&#xff0c;此前由于恶劣的冬季风暴阻…

Python实现比较两个列表(list)范围

Python实现比较两个列表(list)范围 有一道题&#xff1a; 比较两个列表范围&#xff0c;如果包含的话&#xff0c;返回TRUE&#xff0c;否则FALSE。 详细题目如下&#xff1a; Create a function, this function receives two lists as parameters, each list indicates a scop…

单片机里面的CPU使用率是什么鬼?

打开电脑的任务管理器&#xff0c;看着跳动的CPU使用率&#xff0c;发现很舒服。每一个线程占用了多少CPU清清楚楚&#xff0c;也就能针对性的确认为啥你的电脑跑的慢了。今天这篇笔记不讲每个任务&#xff08;或线程&#xff09;CPU的使用情况&#xff0c;而是单片机整体的CPU…

图解,C语言希尔排序

希尔排序和插入排序很相似&#xff0c;有点像插入排序的升级版本。希尔排序是希尔&#xff08;Donald Shell&#xff09;于1959年提出的一种排序算法。希尔排序也是一种插入排序&#xff0c;它是简单插入排序经过改进之后的一个更高效的版本&#xff0c;也称为缩小增量排序&…