一. 实现原理

插入排序的相关知识,参考漫画:什么是插入排序?

二. 具体实现

1. 交换版本

void InsertSort_Swap(int* pData, int size)
{if (nullptr == pData || size <= 0) return;for (int idx = 1; idx < size; ++idx) // 每轮待插入元素的下标{int j = idx - 1;while (j >= 0 && pData[j] > pData[j + 1]) // 注意j是大于等于0,不要漏掉等于{std::swap(pData[j], pData[j + 1]);--j;}}
}

2. 移动版本(改进版)

void InsertSort_Move(int* pData, int size)
{if (nullptr == pData || size <= 0) return;for (int idx = 1; idx < size; ++idx) // 每轮待插入元素的下标{int temp = pData[idx];  // 每轮待插入元素int j = idx - 1; // 待插入元素的前一位置下标while (j >= 0 && pData[j] > temp) // 注意j是大于等于0,不要漏掉等于{pData[j + 1] = pData[j]; // 元素后移--j; } if (j != idx - 1) pData[j + 1] = temp; // 存在元素大于待插入元素,插入待插入元素}
}

三. 输出验证

加上相关的输出信息后再进行调用。

辅助函数:

void Print(int* pData, int size)
{for (int idx = 0; idx < size; ++idx) std::cout << pData[idx] << " ";std::cout << std::endl;
}

初始数据为:

int datas[6] = { 1, 2, 3, 2, 1, 6 };

1. 交换版本

void InsertSort_Swap(int* pData, int size)
{if (nullptr == pData || size <= 0) return;for (int idx = 1; idx < size; ++idx) // 每轮待插入元素的下标{std::cout << std::endl << "NEED INSERT IDX " << idx << std::endl;int j = idx - 1;while (j >= 0 && pData[j] > pData[j + 1]) // 注意j是大于等于0,不要漏掉等于{std::cout << "SWAP IDX : " << j << " AND " << j + 1 << std::endl;std::swap(pData[j], pData[j + 1]);--j;Print(pData, size);}std::cout << "ROUND FINAL" << std::endl;Print(pData, size);}
}

调用输出

NEED INSERT IDX 1
ROUND FINAL
1 2 3 2 1 6NEED INSERT IDX 2
ROUND FINAL
1 2 3 2 1 6NEED INSERT IDX 3
SWAP IDX : 2 AND 3
1 2 2 3 1 6
ROUND FINAL
1 2 2 3 1 6NEED INSERT IDX 4
SWAP IDX : 3 AND 4
1 2 2 1 3 6
SWAP IDX : 2 AND 3
1 2 1 2 3 6
SWAP IDX : 1 AND 2
1 1 2 2 3 6
ROUND FINAL
1 1 2 2 3 6NEED INSERT IDX 5
ROUND FINAL
1 1 2 2 3 6

2. 移动版本

void InsertSort_Move(int* pData, int size)
{if (nullptr == pData || size <= 0) return;for (int idx = 1; idx < size; ++idx) // 每轮待插入元素的下标{std::cout << std::endl << "ROUND " << idx - 1 << std::endl << std::endl;int temp = pData[idx];  // 每轮待插入元素int j = idx - 1; // 待插入元素的前一位置下标while (j >= 0 && pData[j] > temp) // 注意j是大于等于0,不要漏掉等于{std::cout << "STEP " << j << ":" << std::endl;pData[j + 1] = pData[j]; // 元素后移--j; Print(pData, size); } if (j != idx - 1) pData[j + 1] = temp; // 存在元素大于待插入元素,插入待插入元素std::cout << std::endl << "ROUND FINAL" << std::endl << std::endl;Print(pData, size);}
}

调用输出

INIT DATA
1 2 3 2 1 6NEED INSERT IDX 1 VALUE 2
ROUND FINAL
1 2 3 2 1 6NEED INSERT IDX 2 VALUE 3
ROUND FINAL
1 2 3 2 1 6NEED INSERT IDX 3 VALUE 2
IDX 2 ASSIGN TO 3
1 2 3 3 1 6
NEED INSERT IDX ASSIGN TO 2
1 2 2 3 1 6
ROUND FINAL
1 2 2 3 1 6NEED INSERT IDX 4 VALUE 1
IDX 3 ASSIGN TO 4
1 2 2 3 3 6
IDX 2 ASSIGN TO 3
1 2 2 2 3 6
IDX 1 ASSIGN TO 2
1 2 2 2 3 6
NEED INSERT IDX ASSIGN TO 1
1 1 2 2 3 6
ROUND FINAL
1 1 2 2 3 6NEED INSERT IDX 5 VALUE 6
ROUND FINAL
1 1 2 2 3 6FINAL DATA
1 1 2 2 3 6

排序算法之二 插入排序(C++版本)相关推荐

  1. java 实现 常见排序算法(二) 插入排序

    大家好,我是烤鸭: 今天分享一下基础排序算法之直接插入排序. 1.     直接插入排序: 原理:假设前面的数为有序数列,然后有序数列与无序数列的每个数比较,我们可以从右向左比较 思路:从第2个数开始 ...

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

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

  3. 10大排序算法之二:冒泡排序【稳定的】,但复杂度高,一般不用冒泡排序的

    10大排序算法之二:冒泡排序[稳定的],但复杂度高,一般不用冒泡排序的 提示:整个算法界,一共有十大排序算法,每一个算法都要熟悉,才算是算法入门 算法界的十大排序算法分别是: 选择排序.冒泡排序.插入 ...

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

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

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

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

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

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

  7. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

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

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

  9. Java学习第二周(2)--排序算法与二维数组

    声明:由于学习环境为JDK1.8,所有有关Java的代码均在JDK1.8环境中测试通过,若环境发生变换,代码可能会发生错误.     本周的学习难度较上周有明显提升,今天所学习的排序算法有很多需要理解 ...

  10. 常见排序算法之二分插入排序算法

    1.算法思路 是在插入第i个元素时(i前面的元素必定是有序的),对前面的0-i-1元素进行折半,先跟他们中间的那个元素比, 如果小,则对前半再进行折半,否则对后半进行折半, 直到left>rig ...

最新文章

  1. 三甲医院需要部署哪些网络安全设备
  2. DirectUI介绍
  3. python3 多线程_python3--多线程的使用
  4. web自动化原理揭秘
  5. Javascript--cookie创建与查看
  6. 电商后台管理系统-权限管理模块
  7. 阿里云常见热门问题解答汇总
  8. 如何解决谷歌浏览器网页不能复制与右键点击问题
  9. Excel-VBA:文本转换数字
  10. ABAP tRFC和qRFC
  11. SLCP验厂辅导,发布网关是SLCP系统中用于数据托管和共享的关键角色
  12. 批量查找替换excel单元格中的软回车(alt + enter)
  13. (原创)Linux设备轮询机制分析
  14. 深入浅出Java 23种设计模式,最全PDF版本终于开放下载了!!(文末有福利)
  15. FM25V01铁电存储器驱动移植
  16. php+yii框架,yii框架源码分析(一)
  17. linux下录音识别成文字软件下载,录音转文字用哪个手机app可以实现?
  18. 深信服防火墙AF8.0配置
  19. 智能电话机器人源码搭建的原理与功能
  20. 【思维模型】五分钟了解<第一性原理>,为什么学习第一性原理?什么是第一性原理?如何运用第一性原理?

热门文章

  1. JS实现数组去重方法
  2. 在Docker上运行微服务
  3. python yield和generators(生成器)
  4. C++生成随机数:几何分布(geometric distribution)
  5. C# DataTable 按数字排序问题
  6. 【其他】使win7尽量少占用C盘空间
  7. 54.Linux/Unix 系统编程手册(下) -- POSIX 共享内存
  8. 100. SimpleXML
  9. 64. 雇员管理系统
  10. 53. Element setAttribute() 方法