一.原理

  • 由于是直接插入排序,下面假设原始数组中已经有一个元素是5,待插入的元素是3,所以下面的程序中待插入元素的下标i从2开始。数组下标0的位置作为哨兵,暂存待插入的元素。直接插入算法的主要步骤分3步:首先待插入元素的下标i从2开始移动,循环到数组最大长度对应的索引处L->len;然后,将待插入的元素与前一个元素即下标是i-1的元素进行比较。如果前一个元素比待插入的元素大,此时执行直接插入算法。否则不执行,i继续向后移动一个位置,重新插入一个新的元素。接着,将待插入元素暂存在哨兵L->r[0]处(如下图的①)。再接着,将数组的元素向右移动一个位置(即增量为1,给待插入的元素留个位置,准备插入元素啦,如下图的②)。最后,将暂存在哨兵L->r[0]处的带插入元素放到由于上一步向右移动获得的空白位置处,完成整个插入操作(如下图的③),整个过程中的增量increment始终等于1。

二.插入过程

三.完整代码如下:

```#include "iostream"using namespace std;#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 10#define N 9typedef int Status;typedef struct{int r[MAXSIZE+1];int len;} Sqlist;void show(Sqlist L){for (int i = 1; i <= L.len; i++)cout << L.r[i] << " ";cout << endl;}// 直接插入排序void InsertSort(Sqlist *L){int i, j;for (i = 2; i <= L->len; i++){ // 插入的元素从下标为2开始if (L->r[i] < L->r[i - 1]){                      // 插入的元素比之前的元素值小,就进行交换操作L->r[0] = L->r[i]; // 下标为0的位置存放的是哨兵for (j = i - 1; L->r[j] > L->r[0]; j--)L->r[j + 1] = L->r[j]; // 进行移动操作L->r[j + 1] = L->r[0];  // 插入新的元素到正确的位置}}}int main(){Sqlist L0;int d[N] = {9, 1, 5, 8, 3, 7, 4, 6, 2};for(int i = 0; i < N; i++)L0.r[i+1] = d[i];L0.len = N;cout << "直接插入排序前: ";show(L0);cout << "直接插入排序后: ";InsertSort(&L0);show(L0);return 0;}
```
  • STL实现
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// 插入排序思路:// 1.从第一个元素开始,该元素可以认为已经被排序// 2.取出下一个元素,在已经排序的元素序列中从后向前扫描// 3.如果该元素(已排序)大于新元素,将该元素移到下一位置// 4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置// 5.将新元素插入到该位置后// 6. 重复步骤2~5void InsertSort(vector<int>& v){int n = v.size();for(int i=1; i < n; ++i){  int temp = v[i]; // 新元素for(int j = i-1; j>=0; --j){  // 已排序的元素v[j]从后向前扫描if(v[j] > temp){v[j+1] = v[j];v[j] = temp;}else{break;}}}
}// 打印元素
void PrintV(vector<int>& v){for(auto &e: v){cout << e << ' ';}cout << endl;
}int main(){vector<int> v{7, 30, 16, 4, 1, 2, 9};cout << "直接插入排序前: ";PrintV(v);InsertSort(v);cout << "直接插入排序后: ";PrintV(v);return 0;
}

四、直接插入排序时间复杂度总结:

  • 平均时间复杂度:O(n**2)
  • 最好情况:O(n)
  • 最坏情况:O(n**2)
  • 空间复杂度:O(1)
  • 稳定性:稳定

直接插入排序算法实现思想个人理解相关推荐

  1. 快速排序算法实现思想个人理解

    一.概述 快速排序是冒泡排序的改进算法.它也是通过不断比较和移动交换来实现排序的,只不过它的实现增大了记录的比较和移动的距离,将关键字较大的元素从前面直接放到后面,关键字较小的元素直接从后面放到前面, ...

  2. 希尔排序算法实现思想个人理解

    一.原理 希尔排序是对直接插入排序的改进,建立在直接排序的基础上实现的.因为直接插入排序适合那些数据本身就是基本有序的或者数据量比较小的情况.但是,实际中数据量小或数据基本有序属于特殊情况,这就是直接 ...

  3. 选择排序算法实现思想个人理解

    一.选择排序算法个人理解 如果有N个元素需要排序,首先从N个元素中找到最小的那个元素,然后与索引ix=0位置上的元素进行交换(如果没有比原来索引ix=0位置上的元素小就不用交换),接着再从剩下的N-1 ...

  4. 冒泡排序算法实现思想个人理解

    一.冒泡排序算法个人理解 主要是以两个形成嵌套的for循环来完成的.外层的for循环以索引ix的值来逐个访问序列中的每个元素,ix的值由0开始增加到size(sequence) - 1,当外部的for ...

  5. 堆排序算法实现思想个人理解

    一.概述 堆排序是简单选择排序的改进算法,简单选择排序在待排序的个数据中选择一个最小的元素需要进行n-1次的比较,但是并没有将每一次循环的结果保存下来,在下一次循环中,有很多比较已经在上一次的循环中做 ...

  6. “神奇“的表插入排序算法

    文章目录 示例代码 时间复杂度: 直接插入排序算法示例如下: 具体可参考书籍: End 说真的,表插入排序算法是我学习插入排序算法中最难理解的算法之一,特意来写博客记录一下,理解思路真的不会写(或许我 ...

  7. 卡尔曼算法笔记---思想和实际应用物理含义的理解

    此片blog的目的是理解卡尔曼算法的思想和实际应用的物理含义,想法很好,却只能理解冰山一角,先记下这一角 另本blog参考卡尔曼滤波 -- 从推导到应用和徐亦达卡尔曼推导视频 首先认识卡尔曼算法在数学 ...

  8. 关于js数组的六种算法---水桶排序,冒泡排序,选择排序,快速排序,插入排序,希尔排序的理解。...

    1.水桶排序: 原理:首先找到arr这个数组中的最大项 max(此处为88),然后创建一个新的数组bucket,bucket数组长度为max,然后for循环遍历,在bucket的索引为arr[i]的添 ...

  9. 插入排序算法 及其二分搜索优化版 C++代码实现 恋上数据结构笔记

    复习梗概 文章目录 复习梗概 插入排序算法思想 插入排序时间复杂度与特性(多少,与什么有关?) 插入排序基础版 插入排序2nd优化版(优化了哪里?) !!!插入排序二分搜索优化版(优化了哪里?如何优化 ...

最新文章

  1. 上交张伟楠副教授:基于模型的强化学习算法,基本原理以及前沿进展(附视频)
  2. 网络编程学习笔记(gai_strerror函数)
  3. QT的QNoDraw类的使用
  4. 牛客多校 - B-Suffix Array(后缀数组)
  5. sublime同步配置和插件
  6. matlab 打开软件报错,matlab程序错误,提示如下【弄了半夜还是不行】 - 数学 - 小木虫 - 学术 科研 互动社区...
  7. 将本地项目上传到码云(gitee)远程仓库
  8. scrum项目协作是什么_什么是小型Scrum?
  9. 清除tomcat缓存
  10. ios::ate和ios::app在C++文件中的区别
  11. python暴力破解
  12. C# 使用Newtonsoft.Json 对象转json字符串,json字符串转对象
  13. 2017年全国计算机软件水平考试报名时间和报名入口网址
  14. PHP slideup,三级下拉菜单(slideDown/slideUp实现)
  15. Web项目之服务器、客户端存储
  16. mybatis的association以及collection的用法
  17. 一站解决:如何用cd-hit去低于30%的冗余(资源见百度云链接)
  18. 7-5 病毒溯源 (25 分)
  19. HP Sprinter:敏捷加速器
  20. Python项目——万花尺

热门文章

  1. Python自定义主从分布式架构
  2. 8.8线段树和树状数组
  3. Microsoft Hyper-V Server 2012开启虚拟化-虚拟机管理
  4. phpcms v9 实现外部栏目链接在新窗口打开
  5. Win32开发之Format MessageBox 详解
  6. 测试工程师工作流程概论
  7. Java基础篇:泛型
  8. Java集合知识:TreeMap
  9. 微服务和 Serverless 如何强强联合?
  10. 33 张图详解 RSTP 、MSTP、替代技术