C/C++排序算法(1)直接插入排序
常见排序算法总结(1)直接插入排序
一篇文章,带你搞懂 插入排序 (注:代码语言的选择不应该限制了我们对算法的理解)
(1)算法原理
有点感觉了吧
啊?啥? 还是不太明白,那我们来看看动态图!
1、建立一个哨兵(即临时变量),把要插入的数据赋给它。
2、插入数据从后面开始比较,如果大于前面的就记录下标,并将数据后移,直到插入数据碰到比它小的。(注意:这里是比较的数据>待排数据,而不是>=,这样是为了稳定性!)
3、将临时变量赋值给当前记录下标。
4、for循环即完成全部数据插入。
具体代码实现如下:
#include <stdio.h>void display(int array[], int size) {for (int i = 0; i < size; i++) {printf("%d ", array[i]);}printf("\n");
}void InsertSort(int array[], int size) {for (int i = 1; i < size; i++) { // 第 1 个数肯定是有序的,从第 2 个数开始遍历,依次插入有序序列int temp = array[i]; // 取出第 i 个数,和前 i-1 个数比较后,插入合适位置int j = i - 1; // 因为前 i-1 个数都是从小到大的有序序列,所以只要当前比较的数 (array[j]) 比 temp 大,就把这个数后移一位while (j >= 0 && array[j] > temp) { // 当 j < 0 或 array[j] < temp(array[i]) 时终止array[j + 1] = array[j]; // 将大于 temp(array[i]) 的数据后移j--; // 向前比较} // 结束循环array[j + 1] = temp; // array[i]插入到正确的位置上//打印每次排序结果display(array, size);}
}int main() {int array[] = {49, 38, 65, 97, 76, 13, 27, 49, 10};int size = sizeof(array) / sizeof(int);//打印原始数据printf("%d \n", size);display(array, size);InsertSort(array, size);return 0;
}
显示的每一轮排序结果如下(如果只要最终结果,就把display从for里提到main里即可哦)
性能分析
①时间复杂度 O(n^2), 空间复杂度 O(1):最好的情况下:正序有序(从小到大),这样只需要比较 n 次,不需要移动。因此时间复杂度为 O(n);最坏的情况下:逆序有序,这样每一个元素就需要比较 n 次,共有 n 个元素,因此实际复杂度为 O(n^2)。平均情况下:O(n^2)。②稳定性:稳定。③排序时间与输入有关:输入的元素个数;元素已排序的程度。
C/C++排序算法(1)直接插入排序相关推荐
- php代码编写直接插入排序算法,PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析...
本文实例讲述了PHP排序算法之直接插入排序(Straight Insertion Sort).分享给大家供大家参考,具体如下: 算法引入: 在这里我们依然使用<大话数据结构>里面的一个例子 ...
- 插入排序 php,PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
本文实例讲述了PHP排序算法之直接插入排序(Straight Insertion Sort).分享给大家供大家参考,具体如下: 算法引入: 在这里我们依然使用<大话数据结构>里面的一个例子 ...
- 插入排序java_排序算法之直接插入排序Java实现
排序算法之直接插入排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb 选择排序:http://t.cn/hros6e 插入排序:ht ...
- 排序算法(2)直接插入排序
排序算法(2)直接插入排序 原理:将数组中的所有元素依次和前面的已经排好序的元素相比较(依次) ,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过. 代码实现: void InsertS ...
- 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)
快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...
- 我的Java开发学习之旅------Java经典排序算法之二分插入排序
一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较, ...
- 排序算法系列:插入排序算法
概述 直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表. – <大话数据结构> 版权说明 ...
- 排序算法:直接插入排序算法实现及分析
直接插入排序算法介绍 还是先过一遍定义.直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表.来我们用通 ...
- 排序算法第一篇——插入排序
算法描述: 从一个无序的集合中取出一个元素,插入到一个有序的集合的合适位置,有序的集合插入新元素之后,仍然是有序的.所以该算法最核心的部分是要在有序集合中找到合适的插入位置. Java代码: pack ...
最新文章
- Linux下编译vtk的java版本,vtk在linux下的安裝(12月8日更新)
- python中赋值不正确的_python中的“赋值与深浅拷贝”
- 开发日记-20190523 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
- DLL 的导入与导出
- 更改多维数组的数据结构形式
- JAVA中通过时间格式来生成唯一的文件名
- 密码学专题 随机数文件
- 用matlab简单电路模型,基于MATLAB的电路模型仿真应用
- Java高质量代码之 — 泛型与反射
- Leetcode重点250题
- LWIP使用经验---变态级(转)
- RabbitMQ、Redis
- android获取ip命令
- win7修改开机动画
- html留言功能怎么实现,javascript实现留言板功能
- 指纹匹配算法matlab,指纹识别算法matlab程序
- 解决Linux内核问题实用技巧之-dev/mem的新玩法
- 3DsMax游戏模型制作技巧,掌握这些技术你也能接私活啦
- 国内App推广终极37个方法
- 【WebFace260M】《WebFace260M:A Benchmark Unveiling the Power of Million-Scale Deep Face Recognition》
热门文章
- Windows Firewall/Internet Connection Sharing (ICS) 无法启动解决办法
- python线程的学习
- cpu负载转移内存_为什么将所有工作负载转移到云中是个坏主意
- aspell_如何使用Aspell在Linux命令行上检查拼写
- 什么是智能合约 区块链_什么是区块链智能合约?
- vim 文本编辑器_标志性的文本编辑器Vim庆祝成立25周年
- (2)vue.js介绍
- es6 async函数实例:按顺序完成异步操作
- es6 实例:消除魔术字符串
- Git笔记(20) 配置服务器