数据结构期末复习五:内部排序

2023-05-16

排序的基本概念和分类

排序:将杂乱无章的数据按关键字递增(或递减)有序排列

假设Ki=Kj,排序前Ri领先于Rj
稳定排序:排序后的序列Ri仍领先于Rj
不稳定排序:排序后的序列Rj领先于Ri

时间开销关键字比较次数记录移动次数

内部排序:待排序记录存储在随机存储器中
外部排序:待排序记录数量很大,需对外存进行访问

待排序的顺序表的数据结构:

#define MAXSIZE 20

typedef int KeyType;
typedef struct{
	KeyType key;//关键字 
	InfoType otherType;
}RecType;//记录类型 

typedef struct{
	RecType  r[MAXSIZE+1];//r[0]为哨兵项
	int length;
}SqList;

一、插入排序

将待排序的记录按其关键字大小插入已排好的子表中的适当位置

直接插入排序

1.令第一个元素 作为初始有序表
2.依次插入一个元素构造新的有序表

//直接插入法 
void InsertSort(SqList &L){ 
	for(int i=2;i<L.length;i++){
		if(L.r[i].key<L.r[i-1].key){
			L.r[0]=L.r[i];
			L.r[i]=L.r[i-1];
		
		for(int j=i-2;L.r[j].key>L.r[0].key;i--){
			L.r[j+1]=L.r[j];
		}
		L.r[j+1]=L.r[0];
		}
	}
}

算法分析:
1.1个辅助空间r[0]
2.最好情况(正序):
关键词比较次数:n-1
记录不需要移动
3.最差情况(逆序 ):
关键词比较次数:(n+2)(n-1)
记录移动次数:(n+4)(n-1)
4.算法时间复杂度O(n^2)
5.稳定

其他排序

2-路插入排序

折半插入排序

//折半插入法
void BInsertSort(SqList &L){
	for(int i=2;i<L.length;i++){
		L.r[0]=L.r[i];
		int low=1;
		int high=i-1;
		while(low<=high){
			mid=(low+high)/2;
			if(L.r[0].key<L.r[mid].key) high=mid-1;
			else low=mid+1;
		}//插入位置为high+1(或low) 
		for(int j=i-1;j>=high+1;--j) L.r[j+1]=L.r[j];
		L.r[j+1]=L.r[0];
	}
}

算法分析:
1.比较次数与初始状态无关,依赖于记录个数
2.时间复杂度O(n^2)
3.稳定

表插入排序

不移动记录,只移动指针
每个记录维护一个next指针,构成循环链表

希尔排序

将待排序列中相隔某个增量的记录分为若干子序列进行直接插入排序,待基本有序再进行直接插入排序,

增量序列递减,互为质数,最后一个必须是1

//Shell
void ShellSort(SqList &L,int dlta[],int t){//增量存在dlta[]中 
	for(int k=0;k<t;k++){
		ShellInsert(L,dlta[k]);
	}
}

void ShellInsert(SqList &L,int dk){
	for(int i=dk+1;i<=length;i+=dk){	
		if(L.r[i-dk].key>L.r[i].key){
			L.r[0]=L.r[i];
		for(int j=i-dk;L.r[j].key>L.r[0].key;j-=dk){
			L.r[j+dk]=L.r[j];	
		} 
		L.r[j+dk]=L.r[0];
	}
} 

算法分析:
1.不稳定
2.时间复杂度
最好:O(n)
最坏:O(n^2)

二、快速排序

思想:
1.任取一个元素为中心 pivot中心点
2.小的前方,大的后方,形成两个子表(两头向中间交替式逼近法)
3.递归,直到剩一个元素

void QSort(SqList &L,int low,int high){
	if(low<high){
		pivot=Partition(L,low,high);
		QSort(L,low,pivot-1);
		QSort(L,pivot+1,high);
	}
} 

int Partition(SqList &L,int low,int high){
	if(low<high){
		L.r[0]=L.r[low];
		while(low<high&&L.r[0].key<=L.r[high].key){
			high--;
		}
		L.r[low]=L.r[high];
		while(low<high&&L.r[0].key>=L.r[low].key){
			row++;			
		}
		L.r[high]=L.r[low];
	}
	L.r[low]=L.r[0];
	return low;
}
void main(){
	QSort(L,1,L.length);
}

算法分析:
1.时间复杂度:O(nlog2n)
2.空间复杂度:平均O(logn)不是原地排序
递归调用栈的支持,栈的长度取决于栈的深度
3.不稳定
4.不适用于原本有序或基本有序的记录序列进行排列

三、选择排序

简单选择排序

在待排序的数据中选出最大(小的元素)放在其最终的位置
第一趟:n-1次排出最小的
第二趟:n-2次排出次小的
共需n-1趟

堆排序

:任一非叶子结点均小于(大于)孩子结点的完全二叉树
小根堆:小于
大根堆:大于

堆排序思想:
输出堆顶最大(小)值;
剩下的元素调整为新的堆

堆调整(筛选):
小根堆:
1.以堆中最后一个元素代替之
2.根节点与左、右子树的根结点值比较,与其中小者交换
3.重复,直到叶子结点

堆建立
从最后一个非叶子结点开始调整(依次从序号n/2 、n/2-1……1调整)

//堆排序
void HeapSort(elem R[]){
	int i;
	for(i=n/2;i>=1;i--){
		HeapAdjust(R,i,n);
	}
	for(i=n;i>1;i--){
		Swap(R[1],R[i]);
		HeapAdjust(R,1,i-1);
	}
} 

算法分析:
1.时间复杂度:最坏情况下为O(nlog2n)不会最好最坏
2.空间复杂度:O(1)
3.不稳定
4.对元素多时有效

四、归并排序

两个及以上的有序子序列归并为一个有序序列
2-路归并排序
算法分析:
1.时间复杂度:O(nlog2n)
2.空间复杂度:O(n)
3.稳定

五、基数排序(桶排序/箱排序)

思想:分配+收集
适用于关键字的取值范围一定
算法分析:
1.时间复杂度:O(k*(n+m))
2.空间复杂度:O(n+m)
3.稳定

综合比较

时间性能

时间复杂度为O(nlogn):快速(最好)、归并、堆
O(n^2):直接插入(最好)、冒泡、简单选择
适合近似有序
O(n):基数排序

时间复杂度的下限

比较关键字的排序方法最快的时间时O(nlogn)
基数排序除外

空间性能

O(1):直接插入 冒泡 简单选择 堆
O(logn):快速排序(栈)
O(n):归并

稳定性

快速排序和堆排序不稳定

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构期末复习五:内部排序 的相关文章

随机推荐

  • 怎样防止头文件被重复包含?(两种方式)以及它的影响

    xfeff xfeff 一 头文件被重复包含 include文件的一 个不利之处在于一个头文件可能会被多次包含 xff0c 为了说明这种错误 xff0c 考虑下面的代码 include 34 x h 34 include 34 x h 34
  • linux 条件变量

    在多线程编程中仅使用互斥锁来完成互斥是不够用的 xff0c 如以下情形 xff1a 假设有两个线程 t1 和 t2 xff0c 需要这个两个线程循环对一个共享变量 sum 进行自增操作 xff0c 那么 t1 和 t2 只需要使用互斥量即可
  • Invoke与begininvoke

    在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate xff0c 至于委托的本质请参考我的另一随笔 xff1a 对 net事件的看法 一 为什么Control类提供了Invoke和BeginInvoke机制
  • 接口成员显示实现

    xff08 interface xff09 用来定义一种程序的协定 实现接口的类或者结构要与接口的定义严格一致 在前面的文章中 xff0c 我们已经对C 接口的概念 xff0c 如何定义接口以及如何对接口进行访问等问题进行了详细的讨论 在这
  • Oracle基础知识整理总结

    1 Oracle跟SQL Server 2005的区别 xff1f 宏观上 xff1a 1 最大的区别在于平台 xff0c oracle可以运行在不同的平台上 xff0c sql server只能运行在windows平台上 xff0c 由于
  • Javascript调用后台方法

    1 javaScript函数中执行C 代码中的函数 xff1a 方法一 xff1a 1 首先建立一个按钮 xff0c 在后台将调用或处理的内容写入button click中 2 在前台写一个js函数 xff0c 内容为document ge
  • Delphi设置某用户对文件(夹)的权限

    以下在代码在D7 43 2003和D7 43 XP中调试通过 unit NTSecurityU interface Uses Windows AclApi AccCtrl Const SECURITY NULL SID AUTHORITY
  • 关于VMWare压缩虚拟机的虚拟磁盘的问题

    随着我们使用虚拟系统的时间越长 xff0c Vmware创建的虚拟磁盘占用空间就越大 xff0c 即使将虚拟系统中的文件删除 xff0c 虚拟磁盘文件占用宿主系统硬盘空间也不会减少 xff0c 这个问题困扰了很多用户 a S 34 N 43
  • GB2312简体中文编码表

    const GB2312 中文编码 CHpb 61 B0 首页码 CHpe 61 F7 尾页码 CHab 61 A1 首地址 CHae 61 FE 尾地址 GB B 61 B0A1 GB E 61 F7FE ChCount 61 chpe
  • 自定义通信协议

    现在大部分的仪器设备都要求能过通过上位机软件来操作 xff0c 这样方便调试 xff0c 利于操作 其中就涉及到通信的过程 在实际制作的几个设备中 xff0c 笔者总结出了通信程序的通用写法 xff0c 包括上位机端和下位机端等 1 xff
  • vc的编译过程

    对VC 43 43 工程编译过程的梳理 VC 43 43 的项目和解决方案文件解读 xff0c 无非就是利用这些信息进行一个软件的编译 xff0c 这些文件里面是存放的项目的配置和工程的组织 xff0c 类似于makefile文件 但是只有
  • 用WSE在Web服务中验证用户身份

    一 Web服务安全与WS Security 毫无疑问 xff0c SOAP和XML Web服务在交互操作和标准上已经完全改变了电子商务领域的格局 然而直到最近 xff0c 在Web服务技术领域仍然存在着一些缺陷 xff0c 那就是处理消息级
  • 安装CUDA wget下载速度慢解决办法(天下无敌)

    因为墙的原因 xff0c 再加上英伟达工作人员脑筋不会急转弯 xff0c 以及wget是个弟中弟 xff0c 下载cuda时可能会很慢 断线 xff0c 翻墙又不方便 但是没关系 xff0c 谈笑间 xff0c 让我们用一分钟成交它 以ub
  • px4下载指定版本的固件、git用法

    https hub fastgit org PX4 PX4 Autopilot git describe tag 查看当前版本号 git tag l 查看所有版本 xff0c 也就是打个tag git checkout v1 9 1 跳转到
  • YOLOX网络结构

    本文为博主DaneAI原创文章 xff0c 遵循 CC 4 0 BY SA 版权协议 xff0c 转载请附上原文出处链接和本声明 原文链接 xff1a https blog csdn net happyday d article detai
  • 阿木实验室P450无人机硬件接线图备忘录

    其中数传是定制的 xff0c 相当于是路由器 43 数传二合一 xff0c 既负责地面站计算机与pixhawk的通讯 xff0c 又负责发射WiFi信号 组建局域网 xff0c 使板载英伟达NX上位机和手机 平板 笔记本电脑等远程终端连接在
  • yolov3损失函数公式及代码位置,绝对良心(更新)

    版本 xff1a darknet yolov3 环境 xff1a ubuntu16 04 本人小白 xff0c 毕设正在做基于yolov3的目标检测系统研究 xff0c 在网上找了一万遍 xff0c 基本没有靠谱的损失函数 xff0c 全是
  • 使用http协议Header中的Authorization传递token

    1 span class token annotation punctuation 64 GetMapping span span class token punctuation span span class token string 3
  • Shell命令之终端打开网页

    一句话用Safari打开百度 span class hljs built in open span span class hljs operator a span span class hljs string 34 Applications
  • 数据结构期末复习五:内部排序

    排序的基本概念和分类 排序 xff1a 将杂乱无章的数据按关键字递增 xff08 或递减 xff09 有序排列 假设Ki 61 Kj xff0c 排序前Ri领先于Rj 稳定排序 xff1a 排序后的序列Ri仍领先于Rj 不稳定排序 xff1