排序就是讲原本无序的序列重新排序成有序的序列。序列里可以是一个单独数据,也可以是多个数据组合的记录,按照记录里的主关键字或者次关键字进行排序。

排序的稳定性:如果排序表中有两个元素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语言排序算法学习笔记——插入类排序的更多相关文章

  1. C语言排序算法学习笔记——交换类排序

    交换类排序:根据序列中两个元素关键字的比较结果来交换他俩在序列中的位置. 冒泡排序:假设待排序表长为n,从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i])则交换他们 ...

  2. C语言排序算法学习笔记——选择类排序

    选择排序:每一趟(例如第i趟)在后面n-i+1(i=1,2,3,……,n-1)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到n-1趟做完,待排序元素只剩下1个,就不用再选了. 简 ...

  3. 【PHP数据结构】插入类排序:简单插入、希尔排序

    总算进入我们的排序相关算法的学习了.相信不管是系统学习过的还是没有系统学习过算法的朋友都会听说过许多非常出名的排序算法,当然,我们今天入门的内容并不是直接先从最常见的那个算法说起,而是按照一定的规则一 ...

  4. C / C++算法学习笔记(8)-SHELL排序

    原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...

  5. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  6. R语言与机器学习学习笔记

    人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算.大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自 ...

  7. 《Algorithm算法》笔记:元素排序(2)——希尔排序

    <Algorithm算法>笔记:元素排序(2)——希尔排序 Algorithm算法笔记元素排序2希尔排序 希尔排序思想 为什么是插入排序 h的确定方法 希尔排序的特点 代码 有关排序的介绍 ...

  8. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  9. go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE

    go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE Go语言是谷歌2009发布的专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速 ...

随机推荐

  1. Python标准库之textwrap模块

    textwrap通过调整换行符的位置来格式化文本:以下是全部方法 __all__ = ['TextWrapper', 'wrap', 'fill', 'dedent', 'indent', 'shor ...

  2. ckeditor_配置 修改工具栏段落的标签和在文中的格式

    在默认的工具栏中自带一个格式的选项,可以编辑文字的段落属性,将文字转换为标题.ckeditor中提供了方法可以对这个标签进行修改. 正在做的项目中不叫标题1标题2,叫章.节.条... . 需要进行配置 ...

  3. php中print、echo、print_r、var_dump的区别

    echo,print,print_r,var_dump区别 print只能接收一个字符串:print有返回值1(可在表达式中使用) e.g print 'string 1' e.g if($exp & ...

  4. JAVA日常之三

    一.Main方法的args参数 args[] 是程序运行前可传入的参数,比如 java HelloWorld a,那么在HelloWorld的main方法里面 args就是{"a" ...

  5. 转:Eclipse Memory Analyzer入门学习笔记

    原文地址:https://blog.csdn.net/cc907566076/article/details/79108782 Eclipse Memory Analyzer是一个快速而功能丰富的Ja ...

  6. 微信小程序之点击列表的item带参数跳转界面

    1.在js文件里写个界面跳转的事件处理函数gotableinfo,var index = parseInt(e.currentTarget.dataset.index); 为获取当前点击列表的下脚标, ...

  7. jmeter脚本录制与性能指标分析

    一.浏览器代理设置(猎豹) 1.打开猎豹浏览器,进行如下图操作 2.点击局域网设置 3.输入如下信息,注意端口不要重复 4.输入网址www.baidu.com,不能正常访问就是正确的 5.查看添加的端 ...

  8. 并发、并行与多线程——C++

    C++11标准在标准库中为多线程提供了组件. 并发: 并发指的是两个或多个独立的活动在同一时段内发生.同一时间段内可以交替处理多个操作.一个CPU交替处理多个任务,存在竞争关系,在逻辑上表现为一个时段 ...

  9. mininet的学习之一

    mininet命令 (1)--topo (2)--switch (3)--controller (4)--mac 内部交互命令 添加主机 添加链路 添加接口 添加IP 确定是否创建成功 用h1 pin ...

  10. SQLServer 账户当前被锁定

    嗯,被攻击了一波,烦躁很 ‘帐户当前被锁定,所以用户 ‘sa’ 登录失败.系统管理员无法将该帐户解锁’解决方法 如果短时间内不停连接,就会被SQL SERVER误认为是这是攻击,会将此账号锁定. 要用 ...