排序算法--堆排序

堆排序的时间复杂度是O(N*logN),优于选择排序O(N^2)

一、堆

1.堆的概念:堆一般指的是二叉堆,顾名思义,二叉堆是完全二叉树或者近似完全二

2.堆的性质:①完全二叉树

                     ②每个节点的值都大于或等于其子节点的值,为最大堆;反之为最小堆。

3.堆的存储结构是数组,逻辑结构是二叉树

二、 堆排序(包括建堆和排序):

1.建堆的实现原理:

用到向下调整算法,比较两个孩子的大小,选出大的孩子,与父亲比较,如果孩子大于父亲,交换。然后把parent=child,child=parent*2+1;向下调整算法一共会调整h-1次,因此时间复杂度是O(logN)

从最后一个非叶子的节点开始用向下调整算法,实现建大堆。(建小堆就是> < 符号的改变)

2.向下调整算法的过程:

void swap(int* a, int* b)//实现交换的函数
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
//前提下面都是大堆
void AdjustDown(int* a, int n,int root)//向下调整算法
{
	int parent = root;
	int child = parent * 2 + 1;//默认是左孩子,逻辑结构中二叉树的一个规律,左孩子=父亲*2+1
	while (child < n)
	{
		if (child+1<n && a[child] < a[child+1])//排大堆,如果右孩子更大,就让child是右孩子
		{
			child += 1;
		}
		if (a[child] > a[parent])//排大堆,如果孩子大于父亲,交换,并且依次向下调整
		{
			swap(&a[parent], &a[child]);
			parent = child;
			child = parent * 2 + 1;
		}
		else//已经是大堆了,退出while循环
		{
			break;
		}
	} 

 3.建堆:

//建堆:从最后一个非叶子节点开始调整,就可以达到下面都是大堆
for (int i = (n - 1 - 1) / 2; i >= 0; i--)//n-1是最后一个数组下标,求父亲(下标-1)/2
{
	AdjustDown(arr, n, i);
}

4.建堆的时间复杂度是O(N)-->(粗略的了解原理,记住结论就行)

 5.排序:(用大堆)

用小堆的坏处:交换之后踢出第一个数,会导致堆的错位,要重新建堆,时间复杂度O(N^2)

排序的原理:

把第一个最大的数与最后一个数交换,然后把最后一个数踢出堆,继续向下调整算法,再交换次大的数。

int end = n - 1;
while (end > 0)
{
	swap(&arr[0], &arr[end]);
	AdjustDown(arr, end, 0);//把交换之后的根,向下调整,调整h-1次,又变成大堆,再交换,可以得到次小的数
	end--;
}

堆排序的所有代码:

#include<stdio.h>
void swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
//前提下面都是大(小)堆
void AdjustDown(int* a, int n,int root)
{
	int parent = root;
	int child = parent * 2 + 1;//默认是左孩子
	while (child < n)
	{
		if (child+1<n && a[child] < a[child+1])//排大堆
		{
			child += 1;
		}
		if (a[child] > a[parent])//排大堆
		{
			swap(&a[parent], &a[child]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	} 
}
void HeapSort(int* arr, int n)
{
	for (int i = (n - 1 - 1) / 2; i >= 0; i--)//n-1是最后一个数组下标,求父亲(下标-1)/2
	{
		AdjustDown(arr, n, i);
	}
	int end = n - 1;
	while (end > 0)
	{
		swap(&arr[0], &arr[end]);
		AdjustDown(arr, end, 0);//把交换之后的根,向下调整,调整h-1次,又变成大堆,再交换,可以得到次小的数
		end--;
	}
}
int main()
{
	int arr[] = { 10,1,5,3,6,8,7,4,9};
	int n = sizeof(arr) / sizeof(arr[0]);
	HeapSort(arr, n);
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

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

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

相关文章

UE5 C++ 单播 多播代理 动态多播代理

一. 代理机制&#xff0c;代理也叫做委托&#xff0c;其作用就是提供一种消息机制。 发送方 &#xff0c;接收方 分别叫做 触发点和执行点。就是软件中的观察者模式的原理。 创建一个C Actor作为练习 二.单播代理 创建一个C Actor MyDeligateActor作为练习 在MyDeligateAc…

智慧餐饮系统架构的设计与实现

随着科技的不断发展&#xff0c;智慧餐饮系统在餐饮行业中扮演着越来越重要的角色。智慧餐饮系统整合了信息技术&#xff0c;以提高餐饮企业的管理效率、客户服务质量和市场竞争力。本文将探讨智慧餐饮系统架构的设计与实现&#xff0c;并探讨其在餐饮行业中的应用前景。 架构…

2024年2月国内如何快速注册OnlyFans最新小白教学

前言 onlyface软件是一个创立于2016年的订阅式社交媒体平台&#xff0c;创作者可以在自己的账号发布原创的照片或视频&#xff0c;并将其设置成付费模式&#xff0c;若用户想查看则需要每月交费订阅。 需要注意的是&#xff0c;网络上可能存在非法或不道德的应用程序&#xff…

k8s1.23.15集群二进制部署

一、前言 二进制部署1.23.15版本k8s集群&#xff0c;etcd集群部署与k8s集群节点复用&#xff0c;手动颁发集群证书 主机信息如下 主机名称ip地址服务k8s-master0110.1.60.125docker、etcd、kube-apiserver、kube-schduler、kube-controller-manage、kubelet、kube-proxyk8s-no…

Unity(第十部)时间函数和文件函数

时间函数 using System.Collections; using System.Collections.Generic; using UnityEngine;public class game : MonoBehaviour {// Start is called before the first frame updatefloat timer 0;void Start(){//游戏开始到现在所花的时间Debug.Log(Time.time);//时间缩放值…

AI不离谱,大语言模型ChatMusician可以理解曲谱生成AI音乐

虽然大型语言模型在文本生成AI音乐方面已经表现得相当出色&#xff0c;但它们在音乐这一人类创造性领域的表现却还有待提高。然而&#xff0c;近日推出的ChatMusician打破了这一局面&#xff0c;成为了一个集成了内在音乐能力的开源大型语言模型。 ChatMusician论文地址&#x…

【JSON2WEB】06 JSON2WEB前端框架搭建

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 前端技术路线太多了&#xff0c;知识点更多&…

【C语言】学生宿舍信息管理系统

目录 项目说明 1. 数据结构设计 2. 功能实现 3. 主菜单设计 4. 文件操作 5. 系统使用 项目展示 1.主菜单功能界面 ​编辑 2.添加信息 3.查询信息 4.修改信息 5.删除信息 6.退出程序 项目完整代码 结语 在这篇博客中&#xff0c;我们将探讨如何使用C语言来开发…

斯元Z-ONE-China Cybersecurity Tech Landscape·中国网络安全全景图-百度网盘下载

面向全球&#xff0c;斯元Z-ONE正式发布首版「China Cybersecurity Tech Landscape中国网络安全全景图」。 为了提升海外市场对中国网络安全行业的全局认识&#xff0c;方便国际客户及合作伙伴了解中国网络安全科技的赛道分布和国内外厂商对标&#xff0c;助力中国网安厂商出海…

java springmvc/springboot 项目通过HttpServletRequest对象获取请求体body工具类

请求 测试接口 获取到的 获取到打印出的json字符串里有空格这些&#xff0c;在json解析的时候正常解析为json对象了。 工具类代码 import lombok.extern.slf4j.Slf4j; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.we…

FL Studio 21.2.3.3586 for Mac中文版新功能介绍及2024年最新更新日志

如果你正计划学习音乐制作&#xff0c;一款强大且易学的音乐制作软件是必不可少的。由于很多小伙伴对音乐制作软件没有实际体验过&#xff0c;到底选择哪一款软件最合适成为当下最纠结的问题。 这里为大家推荐一款功能强大且适合新手小伙伴的音乐编曲软件—FL Studio 21.2.3.35…

雾锁王国服务器配置怎么选择?阿里云和腾讯云

雾锁王国/Enshrouded服务器CPU内存配置如何选择&#xff1f;阿里云服务器网aliyunfuwuqi.com建议选择8核32G配置&#xff0c;支持4人玩家畅玩&#xff0c;自带10M公网带宽&#xff0c;1个月90元&#xff0c;3个月271元&#xff0c;幻兽帕鲁服务器申请页面 https://t.aliyun.com…

MySQL数据库下载及安装教程

MySQL数据库下载及安装教程 一、MySQL数据库下载及安装教程1.MySQL数据库下载1.1 MySQL官网1.2 MySQL官网下载页&#xff08;表面上的&#xff09;1.3 MySQL官网下载页&#xff08;真正的下载地址&#xff09;1.4 下载教程 2.MySQL数据库安装教程2.1 MySQL数据库安装版配置安装…

腾讯云4核8G服务器支持多少人在线访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

C++:回调函数的应用

本文关于回调函数的学习的学习资料都来自于这里。 原文写得非常详细&#xff0c;所以将原文的大部分内容作为笔记摘抄了过来。 文章目录 1.回调函数1.1普通函数作为回调函数1.2类的静态函数作为回调函数1.3类的非静态成员函数作为回调函数1.4优化--非静态包装为静态 2. std::f…

【ArcGIS】重采样栅格像元匹配问题:不同空间分辨率栅格数据统一

重采样栅格像元匹配问题&#xff1a;不同空间分辨率栅格数据统一 原始数据数据1&#xff1a;GDP分布数据2.1&#xff1a;人口密度数据2.2&#xff1a;人口总数数据3&#xff1a;土地利用类型 数据处理操作1&#xff1a;将人口密度数据投影至GDP数据&#xff08;栅格数据的投影变…

Vite创建的Vue3项目按需导入(自动导入) Element Plus 样式错误以及编译器报错的问题

文章目录 前言配置 Element Plus 自动导入解决 ElMessage, ElNotification 等组件样式不正确的问题解决 ElMessage, ElNotification 等组件编译器报错的问题 前言 在Vite构建的Vue3项目中&#xff0c;可以通过官方推荐的自动导入的方法&#xff0c;方便地使用Element Plus&…

苍穹外卖 -- day10- Spring Task- 订单状态定时处理- WebSocket- 来单提醒- 客户催单

苍穹外卖-day10 功能实现&#xff1a;订单状态定时处理、来单提醒和客户催单 订单状态定时处理&#xff1a; 来单提醒&#xff1a; 客户催单&#xff1a; 1. Spring Task 1.1 介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代…

elementUI 弹窗居中 并且tabs组件 tab-position=“left“时显示的样式优化

需求 项目需要自定义字段&#xff0c;但是有个样式不太好实现&#xff0c;记录一下。 最初效果 优化后效果 <template><el-dialog title"新建字段" :visible.sync"visible" width"50%" :before-close"handleClose"><…

策略模式:封装行为策略,灵活切换实现多态业务逻辑

文章目录 一、引言二、应用场景三、模式定义与实现四、优缺点分析总结 一、引言 ​ 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了算法族&#xff0c;并分别封装起来&#xff0c;让它们之间可以互相替换。这种模式使得算法的变化…