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++代码的速 ...
随机推荐
- Dapp的PVP发模式--magic-maze-2d游戏解读
前言: 未来基于Dapp的游戏可能会多起来吧, 尤其是博彩类游戏, 由于区块链匿名特性, 加之数字货币不受国家监控, 几乎成了一个法外之地. 大量游戏团队都往之涌入. 今天讲讲当前Dapp的一种游戏模 ...
- 数字特征值-java
题目内容: 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值.对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推.这个整数在第n位上的数字记作x,如果x和n的奇偶性相 ...
- LeetCode第一次刷题
感觉自身编程水平还是差很多,所以刷刷题 LeetCode貌似是一个用的人比较多的题库,下面是第一题 给数组和目标和求需要元素的下标 public class Solution { public int ...
- win10磁盘/cpu占用100%问题
https://www.zhihu.com/question/27664545 https://www.zhihu.com/question/27664545 微软自己的解决办法 https://su ...
- 测试那些事儿—软测必备的Linux知识(四)
1.文件权限管理 ls -l 显示的内容如下: 10个字符确定不同用户能对文件干什么 第一个字符:-表示文件,d表示目录,l表示链接 其余字符每3个一组(rwx),r-读,w-写,x-执行 第一组rw ...
- windows 查看端口是否被占用
查看本机端口是否被占用:netstat -ano | findstr "端口号" 用此端口的pid查看是哪个程序在占用:tasklist|findstr "1896&qu ...
- go chan 入门代码
package main import ( "fmt" "sync" "time" ) // 生产数据 func producer(num ...
- Python:从入门到实践--第六章--字典--练习
#1.人:使用一个字典来存储一个熟人的信息;包括姓,名,年龄和居住的城市.将字典中的每项信息都打印出来 friend = { 'last_name':'马', 'first_name':'脑壳', ' ...
- JAVA乐观锁、悲观锁实现
一.名词解释 1.悲观锁:认为每次对数据库的操作(查询.修改)都是不安全的,因此每次操作都会把这条数据锁掉,直到本次操作完毕释放该锁 2.乐观锁:查询数据的时候总是认为是安全的,不会锁数据:等到更新数 ...
- localStore的storage事件
两个浏览器窗口间通信 两个浏览器窗口间通信 补充一下,这里的通讯指遵守同源策略情况下. 为了吸引读者的兴趣,先把demo放到前面:下面有几个我自己写的演示多页面通讯的demo, 为了正常运行,请用 ...