排序算法之选择排序堆排序

算法时间复杂度辅助空间复杂度稳定性
选择排序O(N^2)O(1)不稳定
堆排序O(NlogN)O(1)不稳定

1.选择排序

这应该算是最简单的排序算法了,每次在右边无序区里选最小值,没有无序区时,就宣告排序完毕

比如有一个数组:[2,3,2,6,5,1,4]排序过程如下:

(注意:开始时,蓝色2的下标比红色2

[2,3,2,6,5,1,4]有序区 []

从[2,3,2,6,5,1,4]中选取最小值1

交换1和2

[1,3,2,6,5,2,4]有序区[1]

从[3,2,6,5,2,4]中选取最小值2

交换23

[1,2,3,6,5,2,4]有序区[1,2]

从[3,6,5,2,4]中选取最小值2

交换23

[1,2,2,6,5,3,4]有序区[1,2,2]

从[6,5,3,4]中选取最小值3

交换6和3

[1,2,2,3,5,6,4]有序区[1,2,2,3]

从[5,6,4]中选取最小值4

交换4和5

[1,2,2,3,4,6,5]有序区[1,2,2,3,4]

从[6,5]中选取最小值5

交换5和6

[1,2,2,3,4,5,6]有序区[1,2,2,3,4,5,6]

排序完毕 

可以发现排序之后蓝色2的下标比红色2大,所以选择排序不稳定

鱿鱼选择排序每次都要扫描一遍数组,时间复杂度O(n)而要进行n次扫描操作,所以时间复杂度为O(n*n)

动图 

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a[100000],n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=0;i<n-1;i++){
		int mn=i;
		for(int j=i+1;j<n;j++){
			if(a[j]<a[mn]){
				mn=j;
			}
		}
		swap(a[i],a[mn]);
	}
	for(int i=0;i<n;i++){
		cout<<a[i]<<' ';
	}
	return 0;
}

由于效率过低,通过不了此题 (提交记录)

2.堆排序

是选择排序的改进版

要了解堆排序,首先得了解完全二叉树

2.1完全二叉树

定义:若设二叉树的深度为h除第 h 层外其它各层 (1~h-1) 的结点数都达到最大个数(即1~h-1层为一个满二叉树),第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

举个栗子

这是完全二叉树

这不是

 

这也不是

 

有用的芝士:在完全二叉树中,

节点的左孩子下标= 该节点的下标*2+1,

节点的右孩子下标= 该节点的下标*2+2(第一个元素下标为0)

2.2堆

堆是一种特殊的完全二叉树分为大根堆小根堆!

大根堆大根堆的每个父节点>=父节点对应的子节点

反之亦然

这个是大根堆

 

2.3堆排序

        2.3.1建堆

        分为向上调整算法和向下调整算法

        向上调整法建堆时间复杂度:nlogn(太弱了

        向下调整法建堆时间复杂度:O(n)

        建堆过程以向下调整法建大根堆为例

        向下调整:如果父节点比大的孩子小,则两者交换位置,然后进行新一轮比较,直到叶子或            父节点不小于大的孩子

        建堆:对每个非叶子节点进行向下调整即可

    

          建堆的代码

void mswap(int* a,int * b){//交换函数
	int t=*b;
	*b=*a;
	*a=t;
	return;
}
void down(int pa,int n){
	int chl=pa*2+1;//左孩子
	while(chl<n){
		if(chl+1<n&&f[chl+1]>f[chl]){chl++;}//如果右孩子大于左孩子
		if(f[chl]>f[pa]){
			mswap(f+chl,f+pa);
			pa=chl;
			chl=pa*2+1;//开启新一轮比较
		}
		else{
			break;//不满足条件
		}
	}
}
void makeheap(){
	int flag=n/2;//叶子节点不用比较
	for(int i=flag;i>=0;i--){
		down(i,n);
	}
}

        2.3.2排序

        根据刚才的内容,相信大家都发现了在大(小)根堆中,根节点最大(小)

        于是把堆顶移除就可以排好一个元素,但是移除应该把堆顶和最后一个交换,否则会严重破坏堆序性,增加复杂度!

        这样写只要把新堆顶进行调整即可~~

        所以排序部分就是:

        1.移除堆顶

        2.向下调整新堆顶

        3.重复以上步骤,直到堆空

        上代码

#include<bits/stdc++.h>
using namespace std;
int f[100005],n;
void mswap(int* a,int * b){//自己写的交换
	int t=*b;
	*b=*a;
	*a=t;
	return;
}
void down(int pa,int n){
	int chl=pa*2+1;//左孩子
	while(chl<n){//父亲必须是非叶子节点(条件也可以是pa<n/2)
		if(chl+1<n&&f[chl+1]>f[chl]){chl++;}//如果右孩子比左孩子大
		if(f[chl]>f[pa]){
			mswap(f+chl,f+pa);
			pa=chl;
			chl=pa*2+1;//继续向下调整
		}
		else{
			break;//不满足
		}
	}
}
void heapsort(){
	int flag=n/2;
	for(int i=flag;i>=0;i--){
		down(i,n);
	}//建堆
	for(int i=n-1;i>0;i--){
		mswap(f,f+i);
		down(0,i);
	}//排序
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++) cin>>f[i];
	heapsort();
	for(int i=0;i<n;i++) cout<<f[i]<<' ';
	return 0;//好习惯
}

2.4效率分析

堆排序建堆时间忽略不计!,需要N次交换+调整,调整复杂度为logn所以时间复杂度为O(NlogN)

稳定性:由于是改进版的选择排序,所以不稳定!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924079.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电视网络机顶盒恢复出厂超级密码大全汇总

部分电视机顶盒在按遥控器设置键打开设置时&#xff0c;会弹出设置密码弹窗&#xff0c;需输入密码才能操作其中内容。 如下图所示&#xff1a; 部分电视机顶盒在选择恢复出厂设置时&#xff0c;会出现设置密码弹窗&#xff0c;只有输入操作密码后才能进行恢复出厂设置的操作。…

继续完善wsl相关内容:基础指令

文章目录 前言一、我们需要安装wsl,这也是安装docker desktop的前提,因此我们在这篇文章里做了介绍:二、虽然我们在以安装docker desktop为目的时,不需要安装wsl的分发(distribution),但是装一个分发也是有诸多好处的:三、在使用wsl时,不建议把东西直接放到系统里,因…

基于STM32的智能风扇控制系统

基于STM32的智能风扇控制系统 持续更新&#xff0c;欢迎关注!!! ** 基于STM32的智能风扇控制系统 ** 近几年&#xff0c;我国电风扇市场发展迅速&#xff0c;产品产出持续扩张&#xff0c;国家产业政策鼓励电风扇产业向高技术产品方向发展&#xff0c;国内企业新增投资项目投…

Zero to JupyterHub with Kubernetes中篇 - Kubernetes 常规使用记录

前言&#xff1a;纯个人记录使用。 搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。 参考&…

docker-compose搭建xxl-job、mysql

docker-compose搭建xxl-job、mysql 1、搭建docker以及docker-compose2、下载xxl-job需要数据库脚本3、创建文件夹以及docker-compose文件4、坑来了5、正确配置6、验证-运行成功 1、搭建docker以及docker-compose 略 2、下载xxl-job需要数据库脚本 下载地址&#xff1a;https…

HTTP有哪些风险?是怎么解决的?

一、风险 HTTP是通过明文传输的&#xff0c;存在窃听风险、篡改风险以及冒充风险。 二、如何解决 HTTPS在HTTP的下层加了一个SSL/TLS层&#xff0c;保证了安全&#xff0c;通过混合加密解决窃听风险、数字签名解决篡改风险、数字证书解决冒充风险。 &#xff08;1&#xff0…

《Django 5 By Example》阅读笔记:p339-p358

《Django 5 By Example》学习第13天&#xff0c;p359-p382总结&#xff0c;总计24页。 一、技术总结 1.session (1)session 存储方式 Database sessions File-based sessions Cached sessions Cached database sessions Cookie-based sessions (2)设置 CART_SESSION_I…

Python数据分析(OpenCV)

第一步通过pip安装依赖包&#xff0c;执行一下命令 pip install opencv-python 如果是Anaconda请在工具中自行下载 下载好咋们就可以在环境中使用了。 人脸识别的特征数据可以到 github上面下载&#xff0c;直接搜索OpenCV 然后我们在源码中通过cv2的级联分类器引入人脸的特征…

(免费送源码)计算机毕业设计原创定制:Java+ssm+JSP+Ajax SSM棕榈校园论坛的开发

摘要 随着计算机科学技术的高速发展,计算机成了人们日常生活的必需品&#xff0c;从而也带动了一系列与此相关产业&#xff0c;是人们的生活发生了翻天覆地的变化&#xff0c;而网络化的出现也在改变着人们传统的生活方式&#xff0c;包括工作&#xff0c;学习&#xff0c;社交…

工业AI质检 AI质检智能系统 尤劲恩(上海)信息科技有限公司

来的现代化工厂&#xff0c;将逐步被无人化车间取代&#xff0c;无人工厂除了产线自动化&#xff0c;其无人质检将是绕不开的话题。尤劲恩致力于帮助工业制造领域上下游工厂减员增效、提高品质效率&#xff0c;真正实现无人质检IQC/IPQC/OQC的在线质检系统。分析生产环节真实品…

C 语言数组与函数:核心要点深度剖析与高效编程秘籍

我的个人主页 我的专栏&#xff1a;C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 目录 引言数组基础 2.1 数组的定义与初始化 2.2 一维数组的基本操作 2.3 二维数组及其应用 2.4 数组与指针的关系函数基础 3.1 函数的定义与调用 3.2…

XML JSON

XML 与 JSON 结构 XML&#xff08;eXtensible Markup Language&#xff09; 1. 定义 XML 是一种标记语言&#xff0c;用于描述数据的结构和内容。主要用于数据存储与交换。 2. 特点 可扩展性&#xff1a;用户可以自定义标签。层次化结构&#xff1a;数据以树形结构组织&…

蓝桥杯备赛笔记(一)

这里的笔记是关于蓝桥杯关键知识点的记录&#xff0c;有别于基础语法&#xff0c;很多内容只要求会用就行&#xff0c;无需深入掌握。 文章目录 前言一、编程基础1.1 C基础格式和版本选择1.2 输入输出cin和cout&#xff1a; 1.3 string以下是字符串的一些简介&#xff1a;字符串…

[代码随想录Day24打卡] 93.复原IP地址 78.子集 90.子集II

93.复原IP地址 一个合法的IP地址是什么样的&#xff1a; 有3个’.分割得到4个数&#xff0c;每个数第一个数不能是0&#xff0c;不能含有非法字符&#xff0c;不能大于255。 这个是否属于合法IP相当于一个分割问题&#xff0c;把一串字符串分割成4部分&#xff0c;分别判断每…

v-for产生 You may have an infinite update loop in a component render function

参考文章&#xff1a; 报错解析 [Vue warn]: You may have an infinite update loop in a component render function. 另外一个解决方法 例如: MyList 是一个数组&#xff0c;我希望将排序后的结果返回进行for循环&#xff0c;因此设计了一个myMethon函数 <div v-for"…

中国前首富胡志标亮相创客匠人盛会,点燃创始人 IP 新思维火花

创客匠人正式官宣&#xff01;原爱多VCD创始人、中国前首富胡志标受邀出席创客匠人5000人“全球创始人IP领袖高峰论坛”&#xff0c;将与我们携手共赴这场商业巅峰盛宴。 由创客匠人打造的“全球创始人IP领袖高峰论坛”将在2024年12月26日-28日在厦门市国际博览会议中心如期举…

qsort函数详解+代码展示

文章目录 概要系列文章目录前言(1) 定义(2) 使用&#xff08;举例子 上代码&#xff09;1、定义数组&#xff1a;2、定义比较函数&#xff1a;3、调用 qsort&#xff1a;4、输出结果&#xff1a; (3) 注意事项 小结 概要 本篇博客将详细地介绍qsort排序函数&#xff0c;&#x…

CSS之3D转换

三维坐标系 三维坐标系其实就是指立体空间&#xff0c;立体空间是由3个轴共同组成的。 x轴:水平向右注意:x右边是正值&#xff0c;左边是负值 y轴:垂直向下注意:y下面是正值&#xff0c;上面是负值 z轴:垂直屏幕注意:往外面是正值&#xff0c;往里面是负值 3D移动 translat…

2024年nvm保姆级安装教程

需求&#xff1a;当前我的nodejs的版本是6.14.10&#xff0c;想切换为更高的版本。故使用nvm工具来实现不同node版本之间的切换 目录 一、删除node二、nvm安装三、配置nvm镜像四、安装所需要的nodejs版本nvm常用命令 一、删除node 第一步&#xff1a;首先在控制面板删除node.j…

Python编程语言中的优雅艺术:数值分隔符的巧妙运用

在Python编程的世界里&#xff0c;有许多精巧的设计让代码更优雅、更易读。今天要分享的是一个看似简单却能大幅提升代码可读性的特性 —— 数值分隔符。这个特性从Python 3.6版本开始引入&#xff0c;它用一种极其优雅的方式解决了大数值表示的难题。 数值分隔符的本质与应用…