考研要求掌握的C语言程度(堆排序)1

含义 

堆排序就是把数组的内容在心中建立为大根堆,然后每次循环把根顶和没交换过的根末进行调换,再次建立大根堆的过程

建树的几个公式

一个数组有n个元素

最后一个父亲节点是n/2-1;

假如父亲节点在数组的下标为a

那么左孩子节点在数组下标为2*a+1,右孩子节点在数组下标为2*a+2

大根堆在心里建树的要点

父亲节点必须大于孩子节点,孩子节点大小位置无影响

【注】数组界限问题,以及传参问题

核心代码

//其实没有树,只不过是我们在心里根据数组层次建树来构建大根堆调整数组的排列顺序
//注意我这里的len是数组的长度,注意一下长度和数组下标间的关系
void AdjustDown(int nums[],int pos,int len)
{int dad = pos;int son = 2*dad+1;//左孩子在数组下标while(son < len){if(son+1<len && nums[son]<nums[son+1]){son++;//挑选出左右孩子最大的,只需把son+1变为右孩子下标}if(nums[son]>nums[dad])//只能父亲大于孩子{swap(nums[son],nums[dad]);//交换数据dad =son;//把当前孩子作为父亲,重新循环son = 2*dad+1;}else{break;}}
}
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
//数组
int nums[]={3,87,2,93,78,56,61,38,12,40};
void init_rand(int nums[],int len)
{srand(time(NULL));for(int i=0;i<len;++i){nums[i]=rand()%100+1;//(1,100)}
}
//交换数据
void swap(int &a,int&b)
{int tmp = a;a=b;b=tmp;
}
void print(int nums[],int len)
{for(int i = 0;i<len ;i++ ){printf("%d ",nums[i]);}printf("\n");
}//其实没有树,只不过是我们在心里根据数组层次建树来构建大根堆调整数组的排列顺序
void AdjustDown(int nums[],int pos,int len)
{int dad = pos;int son = 2*dad+1;//左孩子在数组下标while(son < len){if(son+1<len && nums[son]<nums[son+1]){son++;//挑选出左右孩子最大的,只需把son+1变为右孩子下标}if(nums[son]>nums[dad])//只能父亲大于孩子{swap(nums[son],nums[dad]);//交换数据dad =son;//把当前孩子作为父亲,重新循环son = 2*dad+1;}else{break;}}
}//待排序数组,待排序数组的长度
void heap_sort(int nums[],int len)
{int i;//建立大根堆//从最后一个父亲元素开始for(i=len/2-1;i>=0;--i){//调整没个父亲节点为大根堆//数组,父亲节点所在数组的下标,数组长度AdjustDown(nums,i,len);}//建立大根堆之后,有序的数据是在我们内心中建的树,而不是数组,因此我们还需要把他修改为数组中swap(nums[0],nums[len-1]);//先交换树根和最后一个节点的数据(我这里的len代表长度)// print(nums,len);//接着再次进入建立大根堆,换数据的循环中,直到数组有序for(i=len-1;i>0;i--){AdjustDown(nums,0,i);//每次从父亲节点开始(这里的i代表长度)swap(nums[0],nums[i-1]);//每一次交换树根和(除去数组末尾已经换过的)末尾// print(nums,len);}}int main()
{int len = sizeof(nums)/sizeof(nums[0]);init_rand(nums,len);heap_sort(nums,len);print(nums,len);
}

后序补上解析

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

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

相关文章

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-25

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-25 0. 前言 大语言模型在很多领域都有成功的应用&#xff0c;在本期计算机前沿技术进展研究介绍中&#xff0c;我们将带来一篇用大语言模型进行诺贝尔文学作品分析的论文。虽然有一定趁最近诺贝尔奖热潮的意味&…

【STM32 Blue Pill编程实例】-OLED显示HC-SR04超声波测距结果

OLED显示HC-SR04超声波测距结果 文章目录 OLED显示HC-SR04超声波测距结果1、HC-SR04超声波传感器介绍2、硬件准备及接线模块配置3.1 定时器配置3.2 OLED I2C接口配置3.3 HC-SR04引脚配置4、代码实现在本文中,我们将 HC-SR04 超声波传感器与 STM32 Blue Pill 开发板结合使用,并…

stm32单片机个人学习笔记12(DMA直接存储器存取)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…

Java最全面试题->数据库/中间件->RocketMQ面试题

文章目录 RocketMQ多个MQ如何选型?RocketMQ组成部分有哪些?RocketMQ消费模式有几种?消息重复消费如何解决?RocketMQ如何保证消息的顺序消费?RocketMQ如何保证消息不丢失?RocketMQ如何实现分布式事务?RocketMQ的消息堆积如何处理?RocketMQ 下边是我自己整理的面试题,基…

FreeRTOS的事件组

实时嵌入式系统必须对事件做出响应。FreeRTOS允许将事件传递给任务。此类功能的示例包括信号量和队列&#xff0c;两者都具有以下属性&#xff1a; 它们允许任务在“阻塞”状态下等待单个事件发生。  当事件发生时&#xff0c;它们会取消阻塞单个任务——取消阻塞的任务是等待…

【论文阅读】Tabbed Out: Subverting the Android Custom Tab Security Model

论文链接&#xff1a;Tabbed Out: Subverting the Android Custom Tab Security Model | IEEE Conference Publication | IEEE Xplore 总览 “Tabbed Out: Subverting the Android Custom Tab Security Model” 由 Philipp Beer 等人撰写&#xff0c;发表于 2024 年 IEEE Symp…

Pulsar mq 设置延迟消息模式 pulsar mq 发送延迟消息 pulsar如何发送消费延时消息

1. 本文使用spring 提供的pulsarTemplate. 内部对于pulsar client 封装了一层 2.生产者为&#xff1a; String fingerprint UUID.randomUUID().toString();# 可修改TimeUnit 改为小时&#xff0c;天。 pulsarTemplate.newMessage(fingerprint).withTopic("dddd")…

闯关leetcode——222. Count Complete Tree Nodes

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/count-complete-tree-nodes/description/ 内容 Given the root of a complete binary tree, return the number of the nodes in the tree. According to Wikipedia, every level, except possibl…

设计模式基础概念(行为模式):责任链模式(Chain Of Responsibility)

概述 责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理者。 该模式建议你将这些处理者连成一条链。 链上的每个处理者都有一个成员变量来保存对于…

小小猫棒onu替换家用光猫,薅运营商带宽羊毛,突破1000M

小小猫棒onu 一、总体步骤 1 记录原来光猫信息 主要包括SN&#xff0c;ploam密码&#xff0c;loid、loid密码、 mac、上网的vlan id等 一般gpon采用SN、ploam密码、SNploam密码三种中的一种认证方式 一般Epon采用loid&#xff08;逻辑id&#xff09;、mac、loid mac三种中…

【Unity 实用工具篇】 | UGUI 循环列表 SuperScrollView,快速上手使用

前言 【Unity 实用工具篇】 | UGUI 循环列表 SuperScrollView&#xff0c;快速上手使用一、UGUI ScrollRect拓展插件&#xff1a;SuperScrollView1.1 介绍1.2 效果展示1.3 使用说明及下载 二、SuperScrollView 快速上手使用2.1 LoopListView22.2 LoopGridView2.3 LoopStaggered…

【Java并发编程】信号量Semaphore详解

一、简介 Semaphore&#xff08;信号量&#xff09;&#xff1a;是用来控制同时访问特定资源的线程数量&#xff0c;它通过协调各个线程&#xff0c;以保证合理的使用公共资源。 Semaphore 一般用于流量的控制&#xff0c;特别是公共资源有限的应用场景。例如数据库的连接&am…

Spring Boot框架下租房管理系统的设计与实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

9.Linux按键驱动-工作队列

1.思路 1.1在gpio结构体中定义工作队列 1.2 在probe函数中初始化工作队列 1.3.在中断服务程序中调度工作队列 1.4工作队列处理函数&#xff1a; 2.编程 程序&#xff1a; #include <linux/module.h> #include <linux/fs.h> #include <linux/errno.h> #…

基于微信小程序实现信阳毛尖茶叶商城系统设计与实现

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

xtu 哈希

样例输入# 2 2 1 2 4 1 3 5 7 样例输出# 2 3解题思路&#xff1a;欧拉筛素数 满足题意的素数值一定是从n/2开始的。原因&#xff1a;因为每个哈希函数值最多冲突一次&#xff0c;也就是一个哈希值最多出现2次&#xff0c;最坏的情况&#xff0c;数组中所有哈希值都出现2次&…

【判断推理】逻辑论证之一般质疑

不明确选项&#xff1a;表述不够明确&#xff0c;属于既不能加强、也不能削弱的选项 5.1 无论据有结论的一般质疑 无论据有结论&#xff1a;题干往往由“背景、分析、结论”&#xff0c;用提出反向论据的方式反驳论点。 这类题挺简单的&#xff0c;注意话题一致、主题正确&am…

手机拍证件照,换正装有领衣服及底色的方法

证件照在我们的职业生涯的关键节点是经常会用到的&#xff0c;比如毕业入职、人事档案建立、升迁履历、执业资格考试和领证等&#xff0c;这些重要的证件照往往要求使用正装照&#xff0c;有时候手头没有合适的衣服&#xff0c;或者原先的证件照背景色不符合要求&#xff0c;就…

【Fargo】18:camera获取及预览

QCameraViewfinder.ui Build started at 0:10... 1>------ Build started: Project: Fargo, Configuration: Debug Win32 ------

acaconda基础指令(实用不罗嗦,持续更新)

查看conda版本 conda --version 更新acaconda conda update Anaconda 查看有哪些虚拟环境&#xff08;三条均可&#xff09; conda env listconda info -econda info --envs 创建虚拟环境 conda create -n env_name python3.8 激活虚拟环境 conda activate env_name …