插入排序(动图演示,思路详解,代码展示)
一.插入排序
(一).基本思想
把待排序的的几个值按照顺序逐个插入到一个已经排好序的有序序列中,直到所有值插入完成,得到一个新的有序序列.
(二).举例
(三).动图演示
1.全过程动图演示
2.一趟过程演示:
数组中有4,2,6,5,0
假设前四个元素已经排好序2,4,5,6,现在要把数组中的最后一个元素0插入进去
(四).代码实现
以升序为例:
注意:写插入排序时应该充分考虑到边界条件(for循环结束条件)和极端情况
思路:
1.先写一趟的排序过程(假设前end个元素已经排好序了,把第end+1个元素插入进去)
2.再给外面加个for循环,即可实现多趟插入排序,进而完成整个排序
void PrintArray(int* a, int n)
//打印函数,用来打印数组中的元素,验证程序运行结果是否正确
{for (int i = 0; i < n; ++i){printf("%d ", a[i]);}printf("\n");
}
void InsertSort(int* a, int n)
{for (int i = 0; i < n - 1; ++i)//为什么i<n-1而不是i<n,因为end+1才是待排序的那个元素//end+1 < n 等价于 end < n-1{//[0,end]有序,把end+1位置的值插入,保持有序int end = i;int tmp = a[end + 1];while (end >= 0){if (tmp < a[end])//升序{a[end + 1] = a[end];--end;}else{break;}}a[end + 1] = tmp;}
}
void TestInsertSort()//测试插入排序
{int a[] = { 9,2,1,4,7,5,3,8,6 };InsertSort(a, sizeof(a) / sizeof(int));PrintArray(a, sizeof(a) / sizeof(int));
}
int main()
{TestInsertSort();return 0;
}
(五).复杂度分析
时间复杂度为O(N^2)
最优:O(N) 按顺序排或者接近有序 1,2,3,4,5,6,8,7,9
最坏;O(N^2) 完全逆序 9,8,7,6,5,4,3,2,1
显然我们可以看出,插入排序在数组接近有序时,效率非常高,为O(N)
这样,就引出了下节我们要讨论的希尔排序.
插入排序(动图演示,思路详解,代码展示)相关推荐
- 过河问题 思路详解+代码
无论是商人仆人(随从)过河,农夫妖怪过河,还是传教士野人过河-除了里面的角色有所变化,其问题的本质都没有变,可以统称为过河问题 此问题解释较为详细,问题所展现的流程其实也是我真实的思考的过程 文章目录 ...
- 【Web 三件套】JavaScript 入门知识(超多动图、超详解)
文章目录 1. 认识 JavaScript 1.1 JavaScript 基本介绍 1.2 JavaScript.HTML 和 CSS 之间的关系 1.3 JavaScript 的运行过程 1.4 J ...
- 超详细八大排序+基数排序(图文并茂+动图演示+C语言代码演示)
超详细八大排序+基数排序(图文并茂+动图演示+C语言代码演示) 插入排序-直接插入排序 插入排序-希尔排序 选择排序-直接选择排序 选择排序-堆排序 交换排序-冒泡排序 交换排序-快速排序-三种方法( ...
- c 语言从大到小排序算法,10 大经典排序算法(动图演示+ C 语言代码)
原标题:10 大经典排序算法(动图演示+ C 语言代码) 来源:C语言与CPP编程 以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. ...
- 【排序算法】冒泡排序(动图演示) - 保姆级详解
冒泡排序(Bubble Sort)也是一种简单直观的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来. 算法步骤 比较相邻的元素.如果第一个比第二个大,就交换 ...
- 插入排序及其性能分析(动图演示)
插入排序及其性能分析 十大排序算法及其性能总结 基本思路 算法介绍 算法步骤 动图演示 代码实现 性能分析 时间复杂度 空间复杂度 稳定性 十大排序算法及其性能总结 十大排序算法及其性能总结 基本思路 ...
- android仿知乎按钮动效,Android仿知乎客户端关注和取消关注的按钮点击特效实现思路详解...
先说明一下,项目代码已上传至github,不想看长篇大论的也可以先去下代码,对照代码,哪里不懂点哪里. 代码在这https://github.com/zgzczzw/ZHFollowButton 前几 ...
- 程序员面试必备:动图演示十大经典排序算法及代码实现
0.算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序: ...
- 万字手撕七大排序(代码+动图演示)
万字拿捏七大排序 1.排序的概念及其运用 1.1排序的概念 1.2 排序的运用 1.3 常见的排序算法 2. 常见排序算法的实现 2.1 插入排序 2.1.1 基本思想 2.1.2直接插入排序 2.1 ...
最新文章
- Spring @bean冲突解决方案
- 机器学习系列 5:特征缩放
- 作为团队技术负责人,我是这样面试前端的
- 新工具上线!只需2步助你轻松学爬虫!
- 非阻塞模式WinSock编程入门
- python中ix用法_Python中使用ix的数据帧子集
- django mysql数据同步_[django同步数据库]Django去操作已经存在数据的数据库
- Codevs 3269 混合背包(二进制优化)
- 查看Oracle执行计划的几种常用方法-系列1
- php微信卡劵教程,微信卡券添加功能的实现-PHP
- Android菜单不显示图标,Android系统手机让通知栏不显示某个软件的图标 | 坐倚北风...
- oracle错误1327,问题简述:在oracle linux下安装oracle10g,多个文件报“Permission denied”错误...
- 刘宇凡:我是一只特立独行的猪
- Office 2016 Excel实现下拉栏
- RLC无源网络线性元件的微分方程
- 识别图片中的数字------基本思路
- RISC-V Assembly Programmer's Manual
- Linux 上最好的 9 个免费视频编辑软件(2018) | Linux 中国
- java bigdecimal 开方_JAVA BigDecimal使用牛顿迭代法计算平方根(开方)
- php 图片印章_给图片加字,印章在线生成