排序算法之二 插入排序(C++版本)
一. 实现原理
插入排序的相关知识,参考漫画:什么是插入排序?
二. 具体实现
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++版本)相关推荐
- java 实现 常见排序算法(二) 插入排序
大家好,我是烤鸭: 今天分享一下基础排序算法之直接插入排序. 1. 直接插入排序: 原理:假设前面的数为有序数列,然后有序数列与无序数列的每个数比较,我们可以从右向左比较 思路:从第2个数开始 ...
- 插入排序java_排序算法之直接插入排序Java实现
排序算法之直接插入排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb 选择排序:http://t.cn/hros6e 插入排序:ht ...
- 10大排序算法之二:冒泡排序【稳定的】,但复杂度高,一般不用冒泡排序的
10大排序算法之二:冒泡排序[稳定的],但复杂度高,一般不用冒泡排序的 提示:整个算法界,一共有十大排序算法,每一个算法都要熟悉,才算是算法入门 算法界的十大排序算法分别是: 选择排序.冒泡排序.插入 ...
- php代码编写直接插入排序算法,PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析...
本文实例讲述了PHP排序算法之直接插入排序(Straight Insertion Sort).分享给大家供大家参考,具体如下: 算法引入: 在这里我们依然使用<大话数据结构>里面的一个例子 ...
- 插入排序 php,PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
本文实例讲述了PHP排序算法之直接插入排序(Straight Insertion Sort).分享给大家供大家参考,具体如下: 算法引入: 在这里我们依然使用<大话数据结构>里面的一个例子 ...
- 排序算法(2)直接插入排序
排序算法(2)直接插入排序 原理:将数组中的所有元素依次和前面的已经排好序的元素相比较(依次) ,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过. 代码实现: void InsertS ...
- C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】
目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...
- 我的Java开发学习之旅------Java经典排序算法之二分插入排序
一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较, ...
- Java学习第二周(2)--排序算法与二维数组
声明:由于学习环境为JDK1.8,所有有关Java的代码均在JDK1.8环境中测试通过,若环境发生变换,代码可能会发生错误. 本周的学习难度较上周有明显提升,今天所学习的排序算法有很多需要理解 ...
- 常见排序算法之二分插入排序算法
1.算法思路 是在插入第i个元素时(i前面的元素必定是有序的),对前面的0-i-1元素进行折半,先跟他们中间的那个元素比, 如果小,则对前半再进行折半,否则对后半进行折半, 直到left>rig ...
最新文章
- 三甲医院需要部署哪些网络安全设备
- DirectUI介绍
- python3 多线程_python3--多线程的使用
- web自动化原理揭秘
- Javascript--cookie创建与查看
- 电商后台管理系统-权限管理模块
- 阿里云常见热门问题解答汇总
- 如何解决谷歌浏览器网页不能复制与右键点击问题
- Excel-VBA:文本转换数字
- ABAP tRFC和qRFC
- SLCP验厂辅导,发布网关是SLCP系统中用于数据托管和共享的关键角色
- 批量查找替换excel单元格中的软回车(alt + enter)
- (原创)Linux设备轮询机制分析
- 深入浅出Java 23种设计模式,最全PDF版本终于开放下载了!!(文末有福利)
- FM25V01铁电存储器驱动移植
- php+yii框架,yii框架源码分析(一)
- linux下录音识别成文字软件下载,录音转文字用哪个手机app可以实现?
- 深信服防火墙AF8.0配置
- 智能电话机器人源码搭建的原理与功能
- 【思维模型】五分钟了解<第一性原理>,为什么学习第一性原理?什么是第一性原理?如何运用第一性原理?
热门文章
- JS实现数组去重方法
- 在Docker上运行微服务
- python yield和generators(生成器)
- C++生成随机数:几何分布(geometric distribution)
- C# DataTable 按数字排序问题
- 【其他】使win7尽量少占用C盘空间
- 54.Linux/Unix 系统编程手册(下) -- POSIX 共享内存
- 100. SimpleXML
- 64. 雇员管理系统
- 53. Element setAttribute() 方法