C语言排序算法学习笔记——插入类排序
排序就是讲原本无序的序列重新排序成有序的序列。序列里可以是一个单独数据,也可以是多个数据组合的记录,按照记录里的主关键字或者次关键字进行排序。
排序的稳定性:如果排序表中有两个元素R1,R2,其对应的关键字值相等,且排序前R1在R2的前面,如果使用某一排序的算法排序后,R1仍然在R2前面,则称这个排序算法是稳定的,否则称排序算法不稳定。
直接插入排序:首先以一个元素为有序的序列,然后将后面的元素依次插入到有序序列中合适的位置直到所有元素都插入有序序列,其实现为:
void InsertSort(ELemType A[],int n){ //A[0]不存放关键字
int i,j;
for(i=;i<=n;i++) //从第二个元素开始
if(A[i].key<A[i-].key){ //从小到大排序
A[]=A[i]; //将待存元素的值暂存在A[0]中
for(j=i-;A[].key<a[j];--j)
A[j+]=A[j]; //所有比待插入元素值大的都往后移一位
A[j+]=A[]; //把暂存区的值放入该插入的位置
}
}
空间复杂度:在下标为0处存储哨兵,是常数个辅助空间大小,所以空间复杂度为O(1)。
时间复杂度:
①最坏情况,整个序列都是逆序的,外层循环每一轮循环,内层都需要执行完整,总的移动次数为1+2+…+(n-1)=n(n-1)/2,所以时间复杂度为O(n2);
②最好情况,整个序列都是顺序的,外层循环每一轮循环,if都不满足,不会进行内层循环,所以一共有n次比较,所以时间复杂度为O(n)。
稳定性:是稳定的。
折半插入排序:将比较和移动这两个操作分离出来,也就是先利用折半查找找到插入的位置,然后一次性移动元素,再插入该元素。
void InsertSort(Elemtype A[],int n){
int i,j,low,high,mid;
for(i=;i<n;i++){
A[]=A[i];
low=;high=i-;
while(low<=high){ //折半查找
mid=(low+high)/;
if(A[mid].key>A[].key) high=mid-;
else low=mid+;
}
for(j=i-;j>=high+;--j) A[j+]=A[j]; //将待插入位置后的依次后移
A[high+]=A[]; //将待插入插入到腾出的位置
}
}
空间复杂度:O(1)。
时间复杂度:最大O(n2)。
稳定性:稳定。
希尔排序:又称为缩小增量排序,其本质还是插入排序,只不过把待排序序列分成几个子序列,再分别对这几个子序列进行直接插入排序。先以一个增量为d1=n/2进行分组,完成直接插入排序,再以增量d2=⌊d1/2⌋分组,完成直接插入排序,类似过程,直到增量为1完成最后一次直接插入排序。其实现为:
void ShellSort(ElemType A[],int n){
int i,j;
for(d=n/;d>=;d=d/) //初始增量为总长度一半,减小到1
for(i=d+;i<=n;i++)
if(A[i].key<A[i-d].key){
A[]=A[i];
for(j=i-d;j>&&A[].key<A[j].key;j-=d)
A[j+d]=A[j];
A[j+d]=A[];
}
}
空间复杂度:O(1)。
时间复杂度:最大O(n2)。
稳定性:不稳定,因为不同的增量可能就会把相等的关键字划分到两盒直接插入排序中进行排序,造成顺序的变化。
C语言排序算法学习笔记——插入类排序的更多相关文章
- C语言排序算法学习笔记——交换类排序
交换类排序:根据序列中两个元素关键字的比较结果来交换他俩在序列中的位置. 冒泡排序:假设待排序表长为n,从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i])则交换他们 ...
- C语言排序算法学习笔记——选择类排序
选择排序:每一趟(例如第i趟)在后面n-i+1(i=1,2,3,……,n-1)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到n-1趟做完,待排序元素只剩下1个,就不用再选了. 简 ...
- 【PHP数据结构】插入类排序:简单插入、希尔排序
总算进入我们的排序相关算法的学习了.相信不管是系统学习过的还是没有系统学习过算法的朋友都会听说过许多非常出名的排序算法,当然,我们今天入门的内容并不是直接先从最常见的那个算法说起,而是按照一定的规则一 ...
- C / C++算法学习笔记(8)-SHELL排序
原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- R语言与机器学习学习笔记
人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算.大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自 ...
- 《Algorithm算法》笔记:元素排序(2)——希尔排序
<Algorithm算法>笔记:元素排序(2)——希尔排序 Algorithm算法笔记元素排序2希尔排序 希尔排序思想 为什么是插入排序 h的确定方法 希尔排序的特点 代码 有关排序的介绍 ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE
go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE Go语言是谷歌2009发布的专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速 ...
随机推荐
- 解决Ubuntu19.04下网易云音乐打不开的问题
Ubuntu19.04下打开网易云音乐的v18.04版会出现以下错误: opt/netease/netease-cloud-music/netease-cloud-music: symbol look ...
- vue H5页面在微信浏览器打开软键盘关闭导致页面空缺的问题。
methods:{ inputBlur () { // window.scroll(0, 0); setTimeout(() => { // alert(1); if (document.act ...
- JAVA乐观锁、悲观锁实现
一.名词解释 1.悲观锁:认为每次对数据库的操作(查询.修改)都是不安全的,因此每次操作都会把这条数据锁掉,直到本次操作完毕释放该锁 2.乐观锁:查询数据的时候总是认为是安全的,不会锁数据:等到更新数 ...
- 对于Vue的v-if 和 v-showi
V-if : 1. 是条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当的被销毁和重建. 2. 是惰性的,如果初始渲染条件为假,则什么都不做,直到条件第一次变为真的时候,开开始渲染 ...
- 炒鸡讨厌换python版本呀
https://www.cnblogs.com/yjlch1016/p/8641910.html 还是说,装个 Anaconda,你好我好大家好. https://blog.csdn.net/qq_3 ...
- flume安装配置
1 下载安装包并解压 下载地址:http://flume.apache.org/download.html 解压:tar zxvf apache-flume-1.8.0-bin.tar.gz 2 配置 ...
- tensorflow 代码阅读
具体实现: https://github.com/tensorflow/tensorflow/tree/master/tensorflow/core/framework 『深度长文』Tensorflo ...
- 一个简单的例子了解states
在大规模的配置管理工作中,我们要编写大量的states.sls文件.top.sls是states系统的入口文件,它负责指定哪些设备调用哪些states.sls文件.statse的默认工作目录是在/sr ...
- Oracle的安装+PL安装+系统变量配好后重启
服务启动后的样子 第一步安装oracle服务 链接: https://pan.baidu.com/s/1sRu95Vy1arc3gfuH9nH5Wg 提取码: eaxx 复制这段内容后打开百度网盘手机 ...
- Rocketlab公司火箭Electron介绍
http://https://en.wikipedia.org/wiki/Rocket_Lab https://www.rocketlabusa.com/ Rocketlab(火箭实验室)是一家致力于 ...