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

排序的稳定性:如果排序表中有两个元素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. 学习笔记:spark Streaming的入门

    spark Streaming的入门 1.概述 spark streaming 是spark core api的一个扩展,可实现实时数据的可扩展,高吞吐量,容错流处理. 从上图可以看出,数据可以有很多 ...

  2. Yii easyWechat 开发的时候报错:cURL error 60: SSL certificate problem: unable to get local issuer certificat

    最后配置了下php.ini文件curl.cainfo = "D:\AppServ\php5\cacert.pem" //这里填写自己对应的路径并去拷贝了下面链接的代码,自己建了个文 ...

  3. 软件测试第四次作业—— 性能测试(含JMeter实验)

                                           性能测试(含JMeter实验) 一.概览 1.性能测试有几种类型,它们之间什么关系? 2.搭建并简单配置一个JMeter的 ...

  4. python学习笔记(1)python中的注释和安装python

    注释 目标 注释的作用 单行注释 多行注释 01注释的作用 在程序中对代码的标注说明,增强代码的可读性 以 # 开头,# 右边的所有东西都被当做说明文字,而不是真正要执行的程序,只起到辅助说明作用 为 ...

  5. Mabatis面试题

    Mybatis面试题 1请写出Mybatis核心配置文件MyBatis-config.xml的内容? <?xml version="1.0" encoding="U ...

  6. JavaScript第一阶段学习心得

    开始接触JavaScript是从慕课网开始的,基础篇学完.懵了一逼,可能是自己太蠢.感觉跟没学差不多,属性,方法,对象,什么都不懂.有的方法知道起的是什么效果,但是原理什么的都不知道. 还好,基础篇学 ...

  7. docs actifio

    http://docs.actifio.com/ https://www.actifio.com/resource-center/

  8. c# 使用 namedpipe 通信

    using System; using System.IO; using System.IO.Pipes; using System.Diagnostics; using System.Threadi ...

  9. java8_api_net

    网络编程1    操作ip地址        核心类 InetAddress        相关方法 getByName,getAllByName,getLocalHost    操作socket地址 ...

  10. 腾讯云cos对象在线显示

    问题 前端使用了一张cos的图片,但是无法显示图片,使用的是cdn的加速域名地址. 对比:使用服务器的直接域名是可以显示的. 两者地址直接访问时,一者在线显示,一者直接下载到本地. 原因: 使用默认提 ...