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++代码的速 ...
随机推荐
- Debug程序的使用
一.什么是Debug程序: Debug是DOS, Windows(但是Win7 64位没有,8 10不清楚.)都提供的实模式程序的调试工具, 使用它,可以查看CPU各种寄存器中的内容,内存的情况和在机 ...
- python excel 读写
python操作Excel读写--使用xlrd xlwt python中使用xlrd.xlwt操作excel表格详解
- C语言权威指南和书单 - 适用于所有级别
注:点击标题免费下载电子书 所有级别 1. The C Programming Language (2nd Edition) 2. C: A Reference Manual (5th Edition ...
- textview自定义跳转链接
设置方式 ,主要是遍历html中的url,然后加一个自定义的跳转 private void setTextLink(String rule) { if(TextUtils.isEmpty(rule)) ...
- Vue基础之初识Vue
Vue特点及优点 小巧,压缩后体积17KB: 渐进式,不需要一口吃成大胖子,一上来就用所有的东西,可以一步一步.有阶段的先吃成小胖子: 数据驱动,双向数据绑定,MVVM模式,详见下一段 指令,例如v- ...
- 网络编程三 Socket
1.根据netstat端口的找到进程号---->根据进程号找到进程名称-------->终止进程 1) netstat 最后一列是5432 C:\Users\Administrato ...
- UE4 PostProcessVolume 蓝图操作后期框
如图找到场景里面的后期框,首先我们要获得它的设置,Settings 大概就是属性的意思.通过Settings设置其它的属性.Set members in PostProcessSetting 就是接口 ...
- HTML复习 2019-2-11
HTML复习 2019-2-11 <!doctype html> <html> <!-- 常见问题答疑 Question 1:HTML标签可以大写吗? 大小写都可以,比如 ...
- 2_PY基本数据类型
python的数据类型和R差不多,但是需要注意的是字符访问方式与R不一样,另外,python中的“真”和“假”是True False(首字母大写). 1.字符串 字符串和R的定义差不多比如: data ...
- Java Native
native 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由 ...