堆排序(升序降序)

news2025/1/18 18:54:59

        堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏、最好、平均时间复杂度均为O(nlogn),是不稳定排序

小根堆(最小堆):每个结点的值都<=其左右孩子结点的值。

大根堆:每个结点的值都>=其左右孩子结点的值。

 

没有规定其左右孩子之间的大小关系,这与二叉排序树不同。

结点的编号:自顶向下,自左至右连续给结点编号0,1,2,…,n-1,之后按结点编号将树中各结点顺序的存放于顺序表中。

i = 0位置为根结点,没有双亲;i>0时,双亲结点为(i-1)/2;

若2*i+1<n,则i的左孩子为2*i+1;若2*i+2<n,则i的右孩子为2*i+2;

左孩子i都为奇数,右孩子i都为偶数;

i所在的层次为log2(i+1);

 堆排序的降序排序

1.将待排序的序列构建成一个最小堆(先局部再整体从底向上)

        整个序列的最小值为根节点的值

 

2.将根节点的值与末尾元素的值交换

3.剩余n-1个元素继续进行上述两步,直到只剩一个元素,排序完成

创建小根堆

        使用tmp存根的值,i存根下标,j存其左子下标,先对比其左右两子的大小(如果存在),使j指向小的。

        对比根和小的子孩子的值,如果根小则排列完成,否则交换根的小子的值,之后继续排后面的。

        将tmp赋给nums[i],它应该在的地方

void FilterDown(int *nums,int start,int end)//start是当前根结点下标,end为当前小根堆结束下标
{
	int i = start, j = i*2+1;
	int tmp = nums[start];//保存根结点的值
	while ( j<=end )
	{
		if(j+1<=end)//有左右两个孩子
			j = nums[j] < nums[j+1] ? j : j+1;//j指向小的孩子
		if (tmp < nums[j])
			break;
		else
			nums[i] = nums[j];//小的存到上面
		i = j;
		j = i * 2 + 1;
	}
	nums[i] = tmp;
}

堆排序

        先将序列排序成最小堆,然后一个一个交换,存在数组末尾,直到所有数排完。

void HeapSort(int *nums,int n)
{
	if (nums == nullptr || n < 2)return;
	int pos = (n-2)/2;//当前小根堆的根结点下标
//调整成最小堆
	while(pos>=0)
	{
		FilterDown(nums, pos, n-1);
		pos--;//下一个根
	}
//排序
	int end = n-1;
	while (end > 0)
	{
		swap(nums[0], nums[end]);//交换根与最后一个位置的值
		end--;//规模缩小
		FilterDown(nums, 0, end);
	}
}

堆排序的升序排序

        升序排序是创建大根堆来排,其他根上面的代码一样。

        创建堆也可以不用i,j两个存下标,下面用一个写大根堆(这是好久之前用C语言写的,有点不一样)

//创建大根堆
void CreateHeap(int* num, int index, int n)//index是下标,该下标的节点作为父节点
{
    int t = num[index];//存一下父节点的值
    int i = index * 2;//i指向其左子孩子下标(如果存在的话)
    while (i <= n)//有孩子
    {
        if (i < n)//有两个孩子
        {
            if (num[i] < num[i + 1])//找大的孩子
                i++;
        }
        if (t >= num[i])//如果根节点最大,就创建好了当前大根堆,出循环
            break;
        else//如果不是,则把最大的孩子放父节点
        {
            num[i / 2] = num[i];
            i *= 2;//i指向这个最大值孩子节点的左孩子
        }
    }
    num[i / 2] = t;//把刚开始的父节点值存在排好的大根堆的父节点
}
void HeapSort(int* num, int n)
{
    int i;
    for (i = n / 2; i >= 1; i--)//创建大根堆
        CreateHeap(num, i, n);
    for (i = n; i >= 1; i--)//大根堆的顶(最大的值)与大根堆最后一个值交换(排序放在数组的最后一个)
    {
        int t = num[1];
        num[1] = num[i];
        num[i] = t;
        CreateHeap(num, 1, i - 1);//排好一个所以i-1,顶上的根改变了,所以从1开始再一次排好大根堆
    }
}

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

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

相关文章

跨境电商独立站多语言,fecify saas商城解决方案

跨境独立站&#xff0c;面向的是全球国家&#xff0c;每个国家都有自己的语言&#xff0c;譬如&#xff1a;英语&#xff0c;德语&#xff0c;法语&#xff0c;俄语&#xff0c;西班牙语&#xff0c;葡萄牙语&#xff0c;韩语&#xff0c;日语&#xff0c;阿拉伯语&#xff0c;…

Latex-表格和图片

双栏排版表格跨栏加*号\begin{table*}...\end{table*}表格整体尺寸修改\resizebox{列宽}{行高}{...}列宽、行高可以为数值&#xff08;如50mm&#xff09;&#xff0c;也可以根据文字调整&#xff08;如\textwidth指自适应文字宽度&#xff09;表格内文字居中\begin{tabular}{c…

TypeScript变量声明,声明变量的关键字,变量的类型推导

目录 1.变量声明 2.赋值其他类型的值 3.声明变量的关键字 4.变量的类型推导&#xff08;推断&#xff09; 1.变量声明 声明了类型后TypeScript就会进行类型检测&#xff0c;声明的类型可以称之为类型注解&#xff1b; var/let/const 标识符: 数据类型 赋值; 这里的string是…

拉伯证券|年报行情如火如荼 博弈“超预期”还须警惕“风险点

本周以来&#xff0c;在指数转入高位盘整的背景下&#xff0c;A股商场资金围绕年报头绪展开布局&#xff0c;“年报预增”一跃成为商场最强主线&#xff0c;不少成绩预增公司短期股价收获明显超额收益。 Choice数据显现&#xff0c;截至1月12日盘前&#xff0c;开年以来共136家…

VM-图像旋转和拼接

有时受安装空间限制&#xff0c;相机安装方向和人观察角度不一致&#xff0c;需要对图像进行旋转&#xff0c;方便人员核对图像和实物VM中&#xff0c;对图像进行中心旋转的模块有“图像修正”、“几何变换”&#xff0c;其中“图像修正”只能对黑白图像进行旋转&#xff0c;“…

HTML表单:<form>标签

当您想要通过网页来收集一些用户的信息&#xff08;例如用户名、电话、邮箱地址等&#xff09;时&#xff0c;就需要用到 HTML 表单。表单可以接收用户输入的信息&#xff0c;然后将其发送到后端应用程序&#xff0c;例如 PHP、Java、Python 等&#xff0c;后端应用程序将根据定…

ASMR(网站)

ASMR秀 这个网站不需要特殊工具&#xff0c;直接就能看&#xff0c;内含欧美、儿本、H国的ASMR助眠视频节目。ASMR吧 失眠者的福音&#xff0c;也是男同胞的FU利&#xff01;ASMRS生活 专注科普知识。ASMRhtt删ps://除ww文w.as字mr打sho开w即可.com/

DeepMind 发布强化学习通用算法 DreamerV3,AI 成精自学捡钻石

内容一览&#xff1a;强化学习是多学科领域的交叉产物&#xff0c;其本质是实现自动决策且可做连续决策。本文将介绍 DeepMind 最新研发成果&#xff1a;扩大强化学习应用范围的通用算法 DreamerV3。 关键词&#xff1a;强化学习 DeepMind 通用算法 本文首发自微信公众号&#…

沙溢44岁、沈腾、邓超43岁、马丽40岁,他们就不能上春晚了吗

最近笔者浏览网络&#xff0c;发现很多吐槽央视春晚的声音&#xff0c;有些吐槽感觉有理有据&#xff0c;有些就有些强词夺理了。比如说&#xff0c;有人把今年参加春晚演员的年龄&#xff0c;做了一个简单的梳理&#xff0c;似乎想证明一些什么东西。 在这张年龄盘点表当中&am…

spring之面向切面编程AOP概述

文章目录前言一、介绍AOP二、面向切面编程的七大术语三、切点表达式前言 AOP&#xff08;Aspect Oriented Programming&#xff09;面向切面编程&#xff0c;是一种编程技术。 AOP是对OOP&#xff08;面向对象&#xff09;的补充延伸。 AOP底层使用的就是动态代理实现的。 Spr…

论文投稿指南——中文核心期刊推荐(地理学 2)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

2017双11交易系统TMF2.0技术揭秘,实现全链路管理

摘要&#xff1a; 本文是《2017双11交易系统TMF2.0技术揭秘》演讲整理&#xff0c;主要讲解了基于TMF2.0框架改造的交易平台&#xff0c;通过业务管理域与运行域分离、业务与业务的隔离架构&#xff0c;大幅度提高了业务在可扩展性、研发效率以及可维护性问题&#xff0c;同时以…

2023年网络爬虫实训(第一天)

任务1&#xff1a;理解http协议。https协议&#xff0c;tcp协议。udp协议。掌握http的通讯过程。掌握客户端是如何获取respnse并展示数据的。 HTTP协议是建立在请求/响应模型上的。首先由客户建立一条与服务器的TCP链接&#xff0c;并发送一个请求到服务器&#xff0c;请求中包…

基于微信小程序的电影交流平台小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…

Three.js 粗糙度贴图与金属度贴图

在开始介绍贴图之前&#xff0c;我们先介绍一下粗糙度属性以及金属度属性。 粗糙度属性 .roughness 表示材质的粗糙程度&#xff0c;0 表示平滑的镜面反射&#xff0c;1 表示完全漫反射&#xff0c;而金属度属性 .metalness 表示材质与金属的相似度&#xff0c;非金属材质&…

Java基础学习笔记(十四)—— 集合(2)

集合1 Set 集合1.1 Set 集合概述1.2 Set 集合的使用2 TreeSet 类2.1 TreeSet 类概述2.2 TreeSet 基本使用2.3 TreeSet 排序3 HashSet 类3.1 HashSet 类概述3.2 HashSet 基本使用3.3 哈希值3.4 HashSet 案例4 Map 集合4.1 Map 集合概述4.2 Map 常用方法4.3 Map 的遍历5 HashMap …

mysql:存储过程的创建与使用

一、创建存储过程 使用MySql Workbench创建存储过程&#xff0c;一定要记得使用delimiter指明结束符&#xff0c;否则会报错&#xff1a;Statement is incomplete, expecting: ;’ 错误示例&#xff1a; create procedure area_pro1(in mylevel tinyint) beginselect * from…

回看2022,展望2023

目录一、回看2022求职心路身份过度二、展望20232023年&#xff0c;祝大家天天开心&#xff0c;身体健康&#xff0c;万事如意&#xff0c;一起加油&#xff01;一、回看2022 求职心路 2022年过去了&#xff0c;2023年到来了。在2022年我印象比较深刻的是8-11月份的日子&#…

【正点原子FPGA连载】第十六章Petalinux设计流程实战摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十六章Petalin…

大数据必学Java基础(一百二十一):Maven项目结构介绍

文章目录 Maven项目结构介绍 一、标准目录结构 二、结构图 Maven项目结构介绍 一、标准目录结构