堆排序(升序降序)

article/2025/10/3 6:01:20

        堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏、最好、平均时间复杂度均为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;elsenums[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://chatgpt.dhexx.cn/article/XcUg6MnM.shtml

相关文章

python列表中的升序与降序

在使用python进行编程的时候&#xff0c;我们经常使用到列表&#xff0c;并需要对列表里的元素进行升降序操作&#xff0c;下面以一个简单的例子来展示python列表中的升序与降序操作。**例如&#xff1a;**输入三整数x,y,z,现在需要把这三数进行升序和降序操作 **tips:**使用 .…

Python 排序列表——如何按降序或升序排序

在 Python 中&#xff0c;你可以使用 sorted() 方法或 sort() 方法对数据进行排序。 在本文中&#xff0c;我将提供 sorted() 和 sort() 方法的代码示例&#xff0c;并解释两者之间的区别。 Python 排序列表——如何按降序或升序排序 在 Python 中&#xff0c;你可以使用 so…

C语言——选择排序(升序、降序)

举例出第一趟&#xff1a; 从a[0]开始找 遍历找最小值 第一趟排序后&#xff1a; B站“AF程序猿”视频中截到的 第二趟从a[1]开始…… &#xff08;随机生成我这里就指定10以内的了哈&#xff0c;方便看运行结果&#xff09; 程序&#xff08;升序&#xff09;&#xff1a; #…

java数组排序,升序和降序

文章目录 前言基本数据类型排序升序降序排列 基本数据类型包装类升序降序 对象排序升序降序 前言 对于数组的排序一直很疑惑&#xff0c;尤其是如何对数组进行降序排列&#xff0c;例如要对int[]类型的数组降序排列&#xff0c;这里来进行说明 基本数据类型排序 升序 int[]…

Java中的升序和降序

1.使用Arrays中的升序API&#xff08;sort&#xff09;进行升序 代码示例如下&#xff1a; public class px {public static void main(String[] args) {int[] a{11,55,99,66,22,88,33};System.out.println(Arrays.toString(a));//打印原有数组Arrays.sort(a);System.out.pri…

MySQL数据库升降序排序

在使用数据库时&#xff0c;我们可能要将数据按照从小到大&#xff0c;或者从大到小的顺序排序。这样我们就用到了升降序排序。 升序&#xff1a;从小到大&#xff08;asc&#xff09; 以这个表数据为例&#xff1a;从小到大排序 语法&#xff1a; select * from stu order …

Linux中查看bz2压缩文件大小,Linux bz2文件解压与压缩之bzip2命令

1. Linux系统上bz2的简介 在Linux运维中,我们经常看到.bz2后缀的文件,这是一种压缩文件,一般存在于Linux系统当中。本文介绍一下如何使用bzip2工具来压缩和解压bz2文件。 2. 安装bzip2 以CentOS系统为例,最小化安装的情况下,并没有集成bzip2。 [root@zcwyou ~]# bzip2 -ba…

linux 文件夹tar.bz2压缩命令,使用tar命令提取(或解压缩)tar.bz2和tbz2文件的方法...

本文介绍使用tar命令提取(或解压缩)tar.bz2和tbz2文件的方法。tar命令允许你创建和提取tar归档文件,它支持各种压缩程序,例如gzip、bzip2、lzip、lzma、lzop、xz和compress。Bzip2是用于压缩tar文件的最受欢迎的算法之一,按照约定,用bzip2压缩的tar归档文件的名称以.tar.bz…

window系统怎么解压tar.bz2文件

下载7zip工具选择要解压的文件&#xff0c;右键选择7zip > 打开压缩包 点击提取菜单&#xff0c;选择解压之后文件存放的路经 解压出来后是一个.tar格式的文件&#xff0c;此时再次解压即可 耐心等待解压完成 解压完成 欢迎小伙伴讨论&#xff0c;文章内容如有错误请在评论区…

Linux常用命令详解

Linux命令 命令提示符 打开终端时&#xff0c;我们输入信息的左边就是命令提示符&#xff0c;例如&#xff1a; Linux命令提示符结构&#xff1a; 普通用户boy&#xff1a;boyboy-virtual-machine:/$ 根用户root&#xff1a;rootboy-virtual-machine:/# 前面的是当前用户名b…

PHP验证码SESSION验证码图片不同步

PHP验证码SESSION验证码图片不同步 今天在做php登录验证的时候带验证码的&#xff0c;nc的在页面输出了下验证码的session&#xff0c;于是乎出现了戏剧性的一幕&#xff0c;session验证码和图片上的验证码不一样&#xff1f;那用户岂不是登陆不上了&#xff1f;但是奇怪的是用…

php 验证码 生成,PHP实现随机生成验证码功能

验证码在表单实现越来越多了,但是用js的写的验证码,总觉得不方便,所以学习了下php实现的验证码 验证码在表单实现越来越多了,但是用js的写的验证码,总觉得不方便,所以学习了下php实现的验证码。当然,也可以封装成一个函数,以后使用的时候也是很方便的,但是现在未封装。…

php验证是否图片,php验证码图片不显示图片怎么办

php验证码图片不显示图片的解决办法&#xff1a;首先检查php是否安装gd扩展&#xff1b;然后在php目录下找到php.ini文件&#xff1b;最后将文件编码方式改为utf-8无DOM格式&#xff0c;并在header前清除缓存即可。 PHP图片验证码无法显示的解决方案 问题&#xff1a;使用php实…

php验证码刷新_php实现点击可刷新验证码

这篇文章主要介绍了php如何实现点击即可刷新验证码&#xff0c;代码很详细&#xff0c;值得大家学习&#xff0c;感兴趣的小伙伴们可以参考一下 验证码类文件 CreateImg.class.php width$width; $this->height$height; $this->codenum$codenum; } function outImg() { //…

php验证码显示乱码,如何解决php验证码乱码问题

php验证码乱码的解决办法&#xff1a;1、修改访问验证码生成方法函数的路径&#xff1b;2、修改文件编码&#xff0c;并去掉BOM头&#xff1b;3、检查验证码生成方法&#xff1b;4、修改服务环境。 具体问题&#xff1a; php验证码输出全是乱码...<?php session_start(); …

php实现登录验证码_php如何实现登录验证码

php实现登录验证码的方法:首先产生4到6位数的随机验证码;然后把产生的每个字符保存到session或数据库;接着将验证码发送到用户的手机;最后将和输入的验证码进行对比验证即可。 PHP实现简单的验证码功能机制 网站的安全性是开发者不可忽视的一个问题,目前使用最多的一种可以…

php验证码类(分享)

//验证码类 class ValidateCode {private $charset abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789;//随机因子private $code;//验证码private $codelen 4;//验证码长度private $width 130;//宽度private $height 50;//高度private $img;//图形资源句柄private $font…

php验证码图片不显示怎么办,php 验证码图片无法显示怎么办

php验证码图片无法显示的解决办法&#xff1a;首先打开相应的PHP文件&#xff1b;然后在header输出之前添加代码为“ob_clean();”&#xff1b;最后保存修改即可。 本文操作环境&#xff1a;Windows7系统、PHP7.1版&#xff0c;DELL G3电脑 PHP验证码图片无法显示问题 我以为是…

PHP验证码不能显示的问题

最近学校学习任务需要用到验证码&#xff0c;敲完代码后运行时发现验证码并没有生效&#xff0c;上官网查看才发现原来是自己的GD库没有配置&#xff0c;需要我们对php.ini文件进行配置 1、载入GD库 在php.ini文件中写入extensionphp_gd.dll 2、在php.ini文件中开启gd.jpeg_i…

php 验证码功能的实现原理,php验证码实现原理

PHP验证码实现原理 生成随机数或者字母保存到session中(验证验证码的时候用),然后对生成的数字或者字母进行绘图!然后呈现在我们眼前 刷新验证码:用js改变验证码图片所带的参数,让浏览器不读缓存的图片,从而实现刷新验证码效果! 代码示例 $str"QWERTYUIOPASDFGHJKLZXCVBNM…