堆的应用:堆排序

在这里插入图片描述

文章目录

  • 前言
  • 堆排序的实现(升序为例)
  • 代码

前言

堆排序,顾名思义是一个利用堆来完成排序的一个操作。在之前,小编在[C语言学习系列–>【关于qsort函数的详解以及它的模拟实现】] 谈到冒泡排序,但是冒泡排序的时间复杂度(O(n2))着实有点高,堆排序的时间复杂度相对低很多,O(log2N)。

堆排序的实现(升序为例)

堆排序不需要我们手搓一个堆的数据结构,因为我们本质上还是在数组上进行操作

堆排序的思想是:

  • 对待排序数组构建一个大堆或者小堆
  • 将顶端与末尾进行交换,还剩n-1个数
  • 将n-1个数再构建成一个大堆或者小堆,这样反复执行,就可以得到一个有序数组

对于大堆、小堆要有清楚的理解,不知道的可以查看小编博客–>堆的实现(C语言版)

堆排序唯一的坑点是:升序需要建大堆,降序建小堆

结论:升序建大堆,降序建小堆

分析:

假设建小堆:0,3,1,5,4,2,9,7,8,6
在这里插入图片描述
虽然把最小的元素取出来了,但是一旦把最小元素拿出来,那么剩下的元素又需要重新建堆,这样时间复杂度会提高,缺陷较大。

假设建大堆:9,8,6,7,3,1,2,4,5,0

在这里插入图片描述

第一步:将最大的元素,即堆顶的元素和最后一个元素交换

在这里插入图片描述
第二步:除了最大的那一个数,对剩下的数进行向下调整算法,得到堆顶是剩下数中的最大元素,然后再和剩下元素=中的最后一个元素进行交换,依次执行

在这里插入图片描述

代码

HeapSort.c

# define _CRT_SECURE_NO_WARNINGS
void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
void AdjustDown(int* arr, int parent, int n)
{assert(arr);int child = 2 * parent + 1;while (child < n){if ((child + 1) < n && arr[child + 1] > arr[child]){child++;}if (arr[child] > arr[parent]){Swap(&arr[child], &arr[parent]);parent = child;child = 2 * parent + 1;}elsebreak;}
}
void Heapsort(int* arr, int n)
{assert(arr);int i = 0;for (i = (n - 2) / 2; i >= 0; i--)   //建堆{AdjustDown(arr, i, n);}int end = n - 1;while (end){Swap(&arr[0], &arr[end]);AdjustDown(arr, 0, end);end--;}for (i = 0; i < n; i++){printf("%d  ", arr[i]);}printf("\n");
}

在这里插入图片描述

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

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

相关文章

时间序列预测实战(二十)自研注意力机制Attention-LSTM进行多元预测(结果可视化,自研结构)

一、本文介绍 本文给大家带来的是我利用我自研的结构进行Attention-LSTM进行时间序列预测&#xff0c;该结构是我专门为新手和刚入门的读者设计&#xff0c;包括结果可视化、支持单元预测、多元预测、模型拟合效果检测、预测未知数据、以及滚动长期预测&#xff0c;大家不仅可…

6、Qt使用Log4Qt日志

一、知识点 1、Log4Qt有三部分 logger&#xff1a;负责捕获日志信息 layout&#xff1a;负责使用不同的样式输出日志 appender&#xff1a;负责输出信息到不同的目的地&#xff0c;比如数据库、文件、控制台等等 2、 日志级别如下&#xff0c;从上往下依次递增 ALL&#xff1a;…

概率论与数理统计-第4章 随机变量的数字特征

第4章 随机变量的数字特征 4.1数学期望 一、离散型随机变量的数学期望 定义1设离散型随机变量X的概率分布为 P{Xxi}pi,i1,2,…,如果级数绝对收敛&#xff0c;则定义X的数学期望&#xff08;又称均值&#xff09;为 二、连续型随机变量的数学期望 定义2设X是连续型随机变量…

【新手解答2】深入探索 C 语言:一些常见概念的解析

C语言的相关问题解答 写在最前面问题1变量名是否有可能与变量重名&#xff1f;变量名和变量的关系变量名与变量是否会"重名"举例说明结论 变量则是一个地址不变&#xff0c;值时刻在变的“具体数字”变量的地址和值变量名与数据类型具体化示例结论 问题2关于你给我的…

第二十五章 解析cfg文件及读取获得网络结构

网络结构 以YOLOv3_SPP为例 cfg文件 部分&#xff0c;只是用来展示&#xff0c;全部的代码在文章最后 [net] # Testing # batch1 # subdivisions1 # Training batch64 subdivisions16 width608 height608 channels3 momentum0.9 de…

【Spring Boot】Swagger的常用注解

在Swagger的开发过程中&#xff0c;我们需要在Controller代码等处添加相应的注解&#xff0c;以便可以提高生成的接口文档的可读性为了解决这些问题&#xff0c;Swagger提供了很多的注解&#xff0c;通过这些注解&#xff0c;我们可以更好更清晰的描述我们的接口&#xff0c;包…

Kotlin学习之集合

原文链接 Kotlin Collections 现代的软件一般比较复杂&#xff0c;程序语言中的基本数据类型往往不能满足需要&#xff0c;除了基本的数据类型以外&#xff0c;还有对象的容器也非常的重要&#xff0c;比如线性容器&#xff08;数组&#xff0c;列表和Set&#xff09;和二维容…

线性分类器--图像表示

整个模型 图像表示 二进制图像 灰度图像 彩色图像 大多数分类算法都要求输入向量&#xff01; rbg的图像矩阵转列向量 大小为 32X32 的话&#xff0c;图像矩阵转列向量是多少维&#xff1f; 32x32x3 3072 维列向量

Failed to load resource: the server responded with a status of 404 ()

路径问题&#xff1a; 路径省略前面的http://localhost:8080/ 就行了。

[Spring ~必知必会] Bean 基础常识汇总

文章目录 Bean 相关到底什么是beanFactorybeanFactory能干啥ApplicationContext是什么ApplicationContext的功能比 BeanFactory多了什么 容器的实现BeanFactory的实现ApplicationContext的实现xml 配置配置类配置 Bean 的生命周期3.1 Bean 的常见的后处理器测试代码总结 3.2 工…

vue day2

1、指令修饰符&#xff1a;.指明一些指令后缀&#xff0c;不同后缀封装不同处理操作 按键修饰符&#xff1a;keyup.enter v-model修饰符&#xff1a; v-model.trim&#xff1a;去首位空格 v-model.number&#xff1a;转数字 事件修饰符&#xff1a; 阻止事件冒泡&#xff1…

【vue2】axios请求与axios拦截器的使用详解

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;当我们在路由跳转前与后我们可实现触发的操作 【前言】ajax是一种在javaScript代码中发请…