排序-选择排序与堆排序

news2024/12/23 10:56:48

文章目录

    • 一、选择排序
    • 二、堆排序
    • 三、时间复杂度
    • 四、稳定性


一、选择排序

思想:
将数组第一个元素作为min,然后进行遍历与其他元素对比,找到比min小的数就进行交换,直到最后一个元素就停止,然后再将第二个元素min,再遍历,以此下去直到最后一个数据
流程图:
在这里插入图片描述
代码实现:

//交换
void Swap(int* a,int* b) {
	int t = *a;
	*a = *b;
	*b = t;
}
//打印
void Print(int* arr, int n) {

	for (int i = 0;i < n; i++)
		printf("%d ", arr[i]);
}
//直接选择排序
void SelectSort(int* arr, int size) {

	for (int i = 0; i < size; i++)
	{
		int min = i;//从第一个开始
		//每次从i+1的位置开始就不会影响到前面的了
		for (int j = i+1; j < size; j++) {
		//比较
			if (arr[min] > arr[j])
				min =j;//记录下标
		}
		Swap(&arr[i], &arr[min]);//交换
	}
 }
int main() {
	int arr[] = { 43152};
SelectSort(arr, sizeof(arr) / sizeof(arr[0]));
Print(arr, sizeof(arr) / sizeof(arr[0]));
	return 0;
}

运行结果:
在这里插入图片描述
选择排序优化:
我们可以设置一个min和一个max,将小的放到左边,大的放到右边,我们再设置两个控制左右两边下标的变量p,q,当它们相遇时就结束。
流程图:
在这里插入图片描述
特殊情况:max的位置等于p时,我们先交换arr[p]和arr[min],但是max指向p这个位置,但是p这位置的值已经改变了,这时我们就要进行纠正,将max=min,这样才能成功找到原来在p位置的值
如:
在这里插入图片描述
代码实现:

//交换
void Swap(int* a,int* b) {
	int t = *a;
	*a = *b;
	*b = t;
}
//打印
void Print(int* arr, int n) {

	for (int i = 0;i < n; i++)
		printf("%d ", arr[i]);
}
//优化选择排序

void SelectSort1(int* arr, int size) {

	int p = 0, q = size-1;//p指向数组开头,q指向数组最后一个位置
	while (p < q) {//当错过或者相遇就结束
		int min = p, max = p;//迭代位置
		for (int i = p; i <= q; i++)
		{
			if (arr[min] > arr[i])//找到最小值
				min = i;
			if (arr[max] < arr[i])//找到最大值
				max = i;
		}
		Swap(&arr[min], &arr[p]);//交换
		if (max == p)//5 2 3 4 1//判断是否要纠正
			max = min;
		Swap(&arr[max], &arr[q]);//交换
		p++, q--;
	}
}
int main() {
	int arr[] = { 4,3,1,5,2 };
		SelectSort1(arr, sizeof(arr) / sizeof(arr[0]));
	Print(arr, sizeof(arr) / sizeof(arr[0]));
	return 0;
}

运行结果:
在这里插入图片描述

二、堆排序

堆:

结构性:用数组表示的完全二叉树;
有序性:任一结点的关键字是其子树所有结点的最大值(或最小值)
“最大堆(MaxHeap)”,也称“大顶堆”,即最大值所有父亲大于等于孩子
“最小堆(MinHeap)”,也称“小顶堆”,即最小值所有父亲小于等于孩子

小堆:堆顶数据是最小的,并且所有节点都小于左右子树
在这里插入图片描述

大堆:堆顶数据是最大的 ,并且所有节点都大于左右子树
在这里插入图片描述
用堆来实现排序:
(1)使用向下调整算法:
前提:左右子树必须是小堆或者大堆
作用:建堆
如:
左右子树对比选择,再与根比较
在这里插入图片描述
(2)建堆
当我们要实现升序时,通过向下调整法要建大堆
建的过程:因为使完全二叉树,我们可以从最后非叶点节点开始建,直到没有节点就结束。
如:
建大堆
在这里插入图片描述
找左右子树位置:

树的左子树的下标等于根的下标*2+1,的下标等于根的下标 *2+2

建完后,我们可以将最后一个元素和第一个元素交换,然后再做向下调整即可不用重新建堆了,再让第一个元素和倒数第二个元素交换,以此类推…
为什么不建小堆呢?如果建小堆的话,用第一个根(最小值)就是数组的第一个元素了,我们不能动它,那么再让数组的第二元素重新做根,但是这样的话顺序就会被打破,又要重新建堆了,那样时间复杂度会提高(如何实现降序的话可以建小堆)

代码实现:

//交换
void Swap(int* a,int* b) {
	int t = *a;
	*a = *b;
	*b = t;
}
//打印
void Print(int* arr, int n) {

	for (int i = 0;i < n; i++)
		printf("%d ", arr[i]);
}
//向下调整  大堆
void AdjustDwon(int *arr,int p,int size) {
	int q = p;//节点位置
	int z = q * 2 + 1;//节点左子树,z+1就是右子树的位置了
	while (z<size) {//当z大于数组长度时就说明该节点不存在左右子树
	//判断左右子树大小,后面是判断是否有右子树
		if (arr[z] <arr[z + 1]&&z+1<size)
			z += 1;
		if (arr[z] > arr[q]) {//判断是否比根大
			Swap(&arr[z], &arr[q]);
			q = z;
			z = q * 2 + 1;//迭代
		}
		else
			break;
	}
}
void  HeapSort(int* arr,  int size) {
	//建堆,size-1-1就是除2(求子树公式反过来用,最后减一是因为我们求的是下标)
	for (int i = (size - 1 - 1) / 2; i >= 0; i--) {
		AdjustDwon(arr, i, size);
	}
	int ned = size - 1;
//最后一个下标位置开始,和下标为0的元素交换,一直交换下去,并且交换一次就调整一次
	//当ned==1就证明排好了
	while (ned>0) {
		Swap(&arr[0], &arr[ned]);
		AdjustDwon(arr, 0, ned);//重新调整
		ned--;
	}
}

int main() {
	int arr[] = { 4,3,1,5,2 };
	HeapSort(arr, sizeof(arr)/sizeof(arr[0]));
	Print(arr, sizeof(arr) / sizeof(arr[0]));
return 0}

运行结果:
在这里插入图片描述

三、时间复杂度

选择排序:
n-1 ,n-2…2,1
是一个等差数列求前n-1项和,粗略来算就是n^2
所以时间复杂度为O(n^2)

堆排序:
建堆:O(n)
在这里插入图片描述
向下调整的时间复杂度为:
假设树高为 h,树的结点为n,因为n=2^h-1,那么h=log(n-1)(以2为底)
所以为O(logn-1)
我们还要进行n次这个向下调整(当然在进行的过程中n是会变化的)
那么总的次数n+nlogn
所以时间复杂度为O(n
logn)

四、稳定性

稳定性:

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[4],且r[1]在r[4]之前,而在排序后的序列中,r[1]仍在r[4]之前,则称这种排序算法是稳定的;否则称为不稳定的。

选择排序:不稳定
如:
在这里插入图片描述
堆排序:不稳定
在这里插入图片描述
第一个9直接到最后了

以上就是我的分享了,如果有什么错误,欢迎在评论区留言。
最后,谢谢大家的观看!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

温湿度传感器DHT11的简单应用

文章目录 一、DHT11是什么&#xff1f;二、使用步骤1.硬件1.硬件连接2.工作原理1.串行单总线2.温湿度数据采集原理 2.软件1.DHT11初始化如下&#xff08;示例&#xff09;&#xff1a;2.DHT11复位如下&#xff08;示例&#xff09;&#xff1a;3.等待DHT11的回应如下&#xff0…

微信小程序过滤器之计算当前时间差

微信小程序过滤器之计算当前时间差 前言一、wxs简介二、使用步骤1.定义2.使用 前言 最近遇到了一个需求&#xff0c;将小程序里面的具体时间2023-12-11 09:41:06转为当前时间差10小时前&#xff0c;这块可以使用js逻辑函数对数据进行处理&#xff0c;但这里我们采用微信小程序…

Linux系统vim,gcc,g++工具使用及环境配置,动静态库的概念及使用

Linux系统vim&#xff0c;gcc&#xff0c;g工具使用及环境配置&#xff0c;动静态库的概念及使用 1. Linux编辑器-vim的使用1.1 vim的基本概念1.2vim的基本操作1.3vim正常模式命令集1.4vim末端模式命令集1.5简单的vim配置 2.Linux编译器-gcc/g的使用2.1 准备阶段2.2gcc的使用2.…

DevEco Studio将编辑器整体文本改为简体中文

我们打开编辑器 随便进入一个项目 这里 我们左上角目录 选择 File下面菜单中的 Settings… 打开配置界面 然后在设置窗口左侧导航栏中 选择 Plugins 插件 然后上方导航栏中 选择 Installed 参考下图 然后 找到这个Chinese(Simplified) Chinese是什么应该不用我多说吧 我们把…

多合一iPhone 解锁工具:iMyFone LockWiper iOS

多合一iPhone 解锁工具 无需密码解锁 iPhone/iPad/iPod touch 上所有类型的屏幕锁定 在几分钟内解锁 iPhone Apple ID、Touch ID 和 Face ID 立即绕过 MDM 并删除 iPhone/iPad/iPod touch 上的 MDM 配置文件 支持所有 iOS 版本和设备&#xff0c;包括最新的 iOS 17 和 iPhone 1…

从零构建属于自己的GPT系列5:模型部署1(文本生成函数解读、模型本地化部署、文本生成文本网页展示、代码逐行解读)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;数据预处理 从零构建属于自己的GPT系列2&#xff1a;模型训…

Nginx的location和rewrite的使用

目录 常用的Nginx 正则表达式 location location 大致可以分为三类&#xff1a; 精准匹配&#xff1a;location / {...} 一般匹配&#xff1a;location / {...} 正则匹配&#xff1a;location ~ / {...} location 常用的匹配规则 location 优先级 location 示例说明…

day45-46-Vue+ElementUI实现学生管理

VueElementUI实现学生管理 代码&#xff1a; qiushiju/java2313_vue_elementui_crud (gitee.com) 一、思考 考虑需求&#xff08;登录&#xff0c;查询全部&#xff0c;基本增删改查&#xff0c;分页&#xff0c;搜索&#xff0c;批量&#xff09; 设计数据库搭建项目 后端…

【开源】基于Vue+SpringBoot的教学资源共享平台

文末获取源码&#xff0c;项目编号&#xff1a; S 068 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S068。} 文末获取源码&#xff0c;项目编号&#xff1a;S068。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课…

算法:买卖股票的最佳时机(快慢指针和动态规划)

快慢指针 时间复杂度 O(n) 空间复杂度 O(1) /*** param {number[]} prices* return {number}*/ var maxProfit function (prices) {let l 0let r 1let temp 0while (r < prices.length - 1) {// 如果当前左值大于右值说明当前不是最佳买入时机// 所以将右指针赋值给左指…

2023年华为HCIA认证H12-811题库讲解

在VRP平台上&#xff0c;可以通过下面哪种方式返回到上一条历史命令&#xff1f;&#xff08; &#xff09; A、Ctr1U B、Ctr1P C、左光标 D、上光标 试题答案&#xff1a;BD 试题解析&#xff1a;在VRP系统中&#xff0c;ctrlU为自定义快捷键&#xff0c;ct…

六级高频词组2

目录 词组 参考链接 词组 51. arise from&#xff08;be caused by&#xff09; 由…引起。 52. arrange for sb.sth. to do sth. 安排…做… 53. arrive on 到达&#xff1b; arrive at 到达某地&#xff08;小地方&#xff09;&#xff1b;得出&#xff0c;作出&#x…

EasyExcel使用模板导出复杂Excel

1&#xff09;添加easyexlce的依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.0-beta1</version> </dependency>2&#xff09;添加excel模板文件 实现的效果&#xff1a;…

k8s一键部署uniswap

1、拉取uniswap源码 github地址 2、编写Dockerfile并打镜像 # Set the base image FROM node:18.10.0# WORKDIR /usr/src/app/ WORKDIR /home/gateway# Copy files COPY ./ /home/gateway/# Dockerfile author / maintainer LABEL maintainer"Michael Feng <mikehummi…

VSCode使用Remote-SSH连接服务器时报错:无法与“***”建立连接: XHR failed.

关于VSCode的报错问题&#xff1a;无法与“***”建立连接: XHR failed 问题描述问题理解解决方法手动在本地下载安装包&#xff0c;然后手动传到服务器端 问题描述 是的&#xff0c;我又踩坑了&#xff0c;而且这个弄了好久&#xff0c;也重新装了VSCode软件&#xff0c;好像结…

IDEA 2023.3 start failed 启动失败修复

发现是 RestfulToolkit 插件有冲突导致的&#xff0c;删除插件后成功启动 open ~/Library/Application\ Support/JetBrains/IntelliJIdea2023.3/plugins参考&#xff1a;https://youtrack.jetbrains.com/issue/IDEA-340080/Critical-startup-error-after-upgrading-to-Intelli…

Xxl-Job在Linux环境下安装部署

文章目录 Xxl-Job简介环境准备安装下载安装包解压安装包初始化数据库文件修改配置文件打包启动 访问 Xxl-Job简介 Xxl-Job是一个分布式任务调度平台&#xff0c;作者是美团的研发工程师许雪里&#xff0c;Xxl命名的由来盲猜是作者的名字首字母&#xff0c;Job为任务。 环境准…

深入理解模板引擎:解锁 Web 开发的新境界(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

服务器数据恢复—raid5少盘状态下新建raid5如何恢复原raid5数据?

服务器数据恢复环境&#xff1a; 一台服务器上搭建了一组由5块硬盘组建的raid5阵列&#xff0c;服务器上层存放单位重要数据&#xff0c;无备份文件。 服务器故障&分析&#xff1a; 服务器上raid5有一块硬盘掉线&#xff0c;外聘运维人员在没有了解服务器具体情况下&#x…

【C语言程序设计】顺序结构程序设计

目录 前言 一、程序阅读 二、程序改错 三、程序设计 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转…