博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
直接插入排序算法的C++实现
阅读量:5173 次
发布时间:2019-06-13

本文共 1236 字,大约阅读时间需要 4 分钟。

直接插入算法:每趟将一个待排序的关键字按照其值的大小插入到已经排好的部分有序序列的适当位置上,直到所有待排序的关键字都被插入到有序序列中为止。

理论上,在直接插入排序中第二层循环是可以提前结束的,即某个元素在寻找自己合适位置时并未循环遍历到序列最前端。

这是直接插入排序和简单选择排序最大的不同。也是直接插入排序和简单选择排序同为时间复杂度O(n2),但是直接插入排序效率更高的原因。

尤其是在待排序数据基本有序的时候,这种优势将极其明显。甚至此时直接插入排序要比时间复杂度为O(nlogn)的排序算法更加高效。

#include
#include
using namespace std;template
void insertSelectionSort(T arr[],int n){ //不用考虑第0个元素,因为插入排序初始情况下,第0个元素自身就是有序的 for(int i=1;i
0而不是j>=0 for(int j=i;j>0&&arr[j-1]>arr[j];j--) swap(arr[j],arr[j-1]); }}int main(){ int a[10]={
10,9,8,7,6,5,4,3,2,1}; insertSelectionSort(a,10); for(int i=0;i<10;i++) cout<
<<" "; cout<

输出结果:

但是,如果我们进行算法性能测试,我们会发现上面的代码并未将这种效率高的优势显示出来。

原因是在这段代码中存在大量的数值交换,而每一次数值交换都包括三次赋值的操作,在本例中还包括访问数组索引所在位置的时间,这些是比简单的比较耗时更多的存在。

所以我们可以对上面关键代码进行优化。


 

template 
void insertSelectionSort(T arr[],int n){ for(int i=1;i
0&&arr[j-1]>e;j--) //将比待排序关键字的大的关键字依次后移 arr[j]=arr[j-1]; arr[j]=e; }}

在这里我们不再调用swap函数进行数值的交换,而是全都是用赋值语句完成相应的操作。

就大大优化了算法。

需要说明一下的是:对于直接插入排序,一趟排序后并不能确保一个关键字到达其最终位置。

转载于:https://www.cnblogs.com/dudududu/p/8514669.html

你可能感兴趣的文章
【MySQL性能优化】MySQL常见SQL错误用法
查看>>
Vue2全家桶之一:vue-cli(vue脚手架)超详细教程
查看>>
Struts 2 常用技术
查看>>
树形DP
查看>>
python flask解决上传下载的问题
查看>>
语法测试
查看>>
CES1
查看>>
java webcontroller访问时报415错误
查看>>
qcow2、raw、vmdk等镜像格式
查看>>
Jzoj5455【NOIP2017提高A组冲刺11.6】拆网线
查看>>
特定字符序列的判断(1028)
查看>>
华为面试
查看>>
平衡二叉树(AVL Tree)
查看>>
【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
查看>>
【CF799E】Aquarium decoration 线段树
查看>>
大运飞天 鲲鹏展翅
查看>>
从ECMA到W3C
查看>>
软件工程--第十六周学习进度
查看>>
yii2 ActiveRecord多表关联以及多表关联搜索的实现
查看>>
搜狗输入法安装--ubuntu
查看>>