图解,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」获取学习资料网盘链接。
欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~
图解,C语言数据结构,插入排序相关推荐
- 动图图解C语言插入排序算法,含代码分析
C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...
- c语言 数据结构 课程设计 通讯录制作
c语言 数据结构 课程设计 源码 infoBook.c #include "dataStruct.h" #include <stdio.h> #include & ...
- Go语言-数据结构与算法
go语言之专业数据结构与算法 3.golang实现数组结构 code\ArrayList\ArrayList.go package ArrayListimport ("errors" ...
- 快速排序【C语言数据结构】
目录 一.快速排序的基础实现 1.经典写法 2.挖坑法 3.前后指针法 二.快速排序第二部分的写法 三.优化我们基准值的选取 四.快速排序的非递归写法 五.代码的汇总 六.测试代码 快速排序,顾名思义 ...
- c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出
C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...
- 数据结构c语言版第一章答案,《c语言数据结构》第一章概论自测题答案
<<c语言数据结构>第一章概论自测题答案>由会员分享,可在线阅读,更多相关<<c语言数据结构>第一章概论自测题答案(4页珍藏版)>请在人人文库网上搜索. ...
- 一些可运行的C语言数据结构代码
网上有很多C语言数据结构代码:有的不能运行:下面是一些能运行的,和运行截图:备用一下: 1 队列 #include<stdio.h> #include<stdlib.h>#de ...
- 动图图解C语言选择排序算法,含代码分析
C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...
- C语言数据结构学习用单元测试
药物名称: C语言数据结构学习用单元测试 主治: 本品是基于CUnit编写的.全部的.纯C的数据结构(ADT)各种实现的单元测试.主治基础不牢,水品增长缓慢.建议配合严蔚敏<数据结构>(C ...
- 顺序表输入栈元素c语言,C语言数据结构之栈简单操作
C语言数据结构之栈简单操作 实验: 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化顺序栈 (2)插入元素 (3)删除栈顶元素 (4)取栈顶元素 (5)遍 ...
最新文章
- 在Git存储库中查找并恢复已删除的文件
- docker-compose 安装方法
- 修改2k自动登陆的脚本
- 【若依(ruoyi)】shiro 内置的过滤器(filter)
- 部署也是工程的一部分,也要编程(自动化)
- 多功能网址导航源码 包含交易系统等多功能
- WAMP的多站点配置
- Python:cv2.imwrite无法存储带有中文路径图片
- OpenCv —— 检测车牌号(附完整源码)
- PC端后台管理系统实现
- 55.伪造UDP数据包
- java web 04 jQuery jQuery api与jquery-1.7.2.js资料分享
- excel自动排班表_Excel教程:3秒搞定排班表模板
- Win11文件类型怎么改?Win11修改文件后缀的方法
- ffmpeg批量转换ts为mp4
- 天津理工大学和天津工业大学计算机考研,天津工业大学和天津理工大学,谁的实力更强?谁的录取分数更高呢...
- 脸书AI首席开发布道师:如何贡献PyTorch代码
- uniapp引用外部js_Uniapp怎么引入外部js
- ASP.NET2.0:利用Localization实现本地化
- Sql Server REPLACE函数的使用;SQL中 patindex函数的用法