常见排序算法总结(1)直接插入排序

一篇文章,带你搞懂 插入排序 (注:代码语言的选择不应该限制了我们对算法的理解)

(1)算法原理

插入排序是一种最简单直观的排序算法,思想就是,从第二个数开始(下标为0的已经默认排序了),依次跟前面的数比较,直到当前比较数据更小,就放在这个数据的后面。(别担心不能放入,因为每次比较就把位置向后挪了一位!) 
(2)算法步骤
①将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成
是未排序序列。
②从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如
果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
直接插入排序示例:

有点感觉了吧

啊?啥? 还是不太明白,那我们来看看动态图!

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)直接插入排序相关推荐

  1. php代码编写直接插入排序算法,PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析...

    本文实例讲述了PHP排序算法之直接插入排序(Straight Insertion Sort).分享给大家供大家参考,具体如下: 算法引入: 在这里我们依然使用<大话数据结构>里面的一个例子 ...

  2. 插入排序 php,PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析

    本文实例讲述了PHP排序算法之直接插入排序(Straight Insertion Sort).分享给大家供大家参考,具体如下: 算法引入: 在这里我们依然使用<大话数据结构>里面的一个例子 ...

  3. 插入排序java_排序算法之直接插入排序Java实现

    排序算法之直接插入排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb 选择排序:http://t.cn/hros6e 插入排序:ht ...

  4. 排序算法(2)直接插入排序

    排序算法(2)直接插入排序 原理:将数组中的所有元素依次和前面的已经排好序的元素相比较(依次)  ,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过. 代码实现: void InsertS ...

  5. 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...

  6. 我的Java开发学习之旅------Java经典排序算法之二分插入排序

    一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较, ...

  7. 排序算法系列:插入排序算法

    概述 直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表. – <大话数据结构> 版权说明 ...

  8. 排序算法:直接插入排序算法实现及分析

    直接插入排序算法介绍 还是先过一遍定义.直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表.来我们用通 ...

  9. 排序算法第一篇——插入排序

    算法描述: 从一个无序的集合中取出一个元素,插入到一个有序的集合的合适位置,有序的集合插入新元素之后,仍然是有序的.所以该算法最核心的部分是要在有序集合中找到合适的插入位置. Java代码: pack ...

最新文章

  1. Linux下编译vtk的java版本,vtk在linux下的安裝(12月8日更新)
  2. python中赋值不正确的_python中的“赋值与深浅拷贝”
  3. 开发日记-20190523 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  4. DLL 的导入与导出
  5. 更改多维数组的数据结构形式
  6. JAVA中通过时间格式来生成唯一的文件名
  7. 密码学专题 随机数文件
  8. 用matlab简单电路模型,基于MATLAB的电路模型仿真应用
  9. Java高质量代码之 — 泛型与反射
  10. Leetcode重点250题
  11. LWIP使用经验---变态级(转)
  12. RabbitMQ、Redis
  13. android获取ip命令
  14. win7修改开机动画
  15. html留言功能怎么实现,javascript实现留言板功能
  16. 指纹匹配算法matlab,指纹识别算法matlab程序
  17. 解决Linux内核问题实用技巧之-dev/mem的新玩法
  18. 3DsMax游戏模型制作技巧,掌握这些技术你也能接私活啦
  19. 国内App推广终极37个方法
  20. 【WebFace260M】《WebFace260M:A Benchmark Unveiling the Power of Million-Scale Deep Face Recognition》

热门文章

  1. Windows Firewall/Internet Connection Sharing (ICS) 无法启动解决办法
  2. python线程的学习
  3. cpu负载转移内存_为什么将所有工作负载转移到云中是个坏主意
  4. aspell_如何使用Aspell在Linux命令行上检查拼写
  5. 什么是智能合约 区块链_什么是区块链智能合约?
  6. vim 文本编辑器_标志性的文本编辑器Vim庆祝成立25周年
  7. (2)vue.js介绍
  8. es6 async函数实例:按顺序完成异步操作
  9. es6 实例:消除魔术字符串
  10. Git笔记(20) 配置服务器