[数据结构]——二叉树——堆排序

 

后续代码以此为基础

typedef int HPDataTyp;
typedef struct Heap
{HPDataTyp * a;
int size;
int capacity;
} Hp;

1.首先我们需要掌握两种堆算法

1,堆向下调整算法


现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整成一个小堆。向下调整算法有一个前提:左右子树必须是一个堆,才能调整。

int array[] = {27,15,19,18,28,34,65,49,25,37};

 

 代码实现:改一下比较大小便实现大小堆

a,表示需要调整的数组;size表示数组的大小;parent表示需要调整的节点的下标。

计算出左孩子的下标child = parent * 2 + 1。

将较小的节点上浮到正确的位置

1.实现小堆
void adjustdown(HPDataTyp* a, int size, int parent)
{int child = parent * 2 + 1;while (child < size){if (child + 1 < size && a[child ] > a[child+1]){++child;}if (a[child] < a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 -+1;}else{break;}}
}
 2.实现大堆
void adjustdown(HPDataTyp* a, int size, int parent)
{int child = parent * 2 + 1;while (child < size){if (child + 1 < size && a[child ] < a[child+1]){++child;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 +1;}else{break;}}
}

2,堆向上调整算法

堆向上调整算法是一种用于维护堆的性质的算法,通常用于在插入元素或者修改元素值后,将堆重新调整为满足堆性质的状态。堆向上调整算法的基本思想是,从插入或修改的位置开始,向上比较并交换元素,直到满足堆的性质为止。

具体步骤如下:

    1.将新插入或修改的元素放置在堆的最后一个位置。

     2.比较该元素与其父节点的大小关系,如果不满足堆的性质(大顶堆要求父节点大于等于子节点,小顶堆要求父节点小于等于子节点),则交换两者的位置。

   3.重复步骤2,直到满足堆的性质为止。

下图为堆向上调整算法的示意图:

  1.          10
           /    \
          7      9
         / \    / \
        6   5  8   4

    插入元素3后,堆如下所示:
             10
           /    \
          7      9
         / \    / \
        6   5  8   4
       /
      3

    经过堆向上调整算法调整后,堆如下所示:
             10
           /    \
          7      9
         / \    / \
        6   5  8   4
       / \
      3   3
     

代码实现 :

1.实现小堆
void adjustup(HPDataTyp* a, int child)
{int parent = (child  - 1)/2;while (child > 0){if (a[child] < a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}
 2.实现大堆

2.. 建堆


1.升序:建大堆

for (int i = 0; i <n; ++i){adjustup(a,i);}


2.降序:建小堆

for (int i = (n-1 -1) / 2; i >= 0; --i){adjustdown(a, n, i);}

3.排序

————————————————使用实现小堆的代码——————————————————

1.降序

void heapSort(int* a, int n)
{for (int i = 1; i <n; i++){adjustup(a, i);}int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);adjustdown(a, end, 0);--end;}
}

或者

void heapSort(int* a, int n)
{for (int i = 1; i <n; i++){adjustup(a, i);}int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);adjustdown(a, end, 0);--end;}
}

 2.升序

————————————————使用实现大堆的代码——————————————————

 和降序的看似代码一样,只不过大小堆区别一定要分清

void heapSort(int* a, int n)
{for (int i = 1; i <n; i++){adjustup(a, i);}int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);adjustdown(a, end, 0);--end;}
}

void heapSort(int* a, int n)
{for (int i = 1; i <n; i++){adjustup(a, i);}int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);adjustdown(a, end, 0);--end;}
}

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

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

相关文章

【Java开发指南 | 第十篇】Java修饰符

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 JAVA修饰符访问修饰符非访问修饰符static 修饰符final 修饰符abstract 修饰符synchronized 修饰符transient 修饰符volatile 修饰符 JAVA修饰符 修饰符用来定义类、方法或者变量&#xff0c;通常放在语句的最前…

C#创建磁性窗体的方法:创建特殊窗体

目录 一、磁性窗体 二、磁性窗体的实现方法 (1)无标题窗体的移动 (2)Left属性 (3)Top属性 二、设计一个磁性窗体的实例 &#xff08;1&#xff09;资源管理器Resources.Designer.cs设计 &#xff08;2&#xff09;公共类Frm_Play.cs &#xff08;3&#xff09;主窗体 …

JavaWeb前端/后端开发规范——接口文档概述及YApi平台的使用

前言&#xff1a; 整理下笔记&#xff0c;打好基础&#xff0c;daydayup!!! 接口文档 什么是接口文档&#xff1f; 目前主流的开发模式为前后端分离式开发&#xff0c;为了方便前后端的对接&#xff0c;就需要使用接口文件进行统一规范。 接口文档记载什么信息&#xff1f; 1&…

李飞飞团队发布《2024年人工智能指数报告》,预测人工智能未来发展趋势

昨天&#xff0c;斯坦福大学 Human-Center Artificial Intelligence (HAI)研究中心发布了《2024年人工智能指数报告》。 由斯坦福大学发起的人工智能指数&#xff08;AI Index&#xff09;是一个追踪 AI 动态和进展的非营利性项目&#xff0c;旨在全面研究 AI 行业状况&#xf…

物联网的核心价值是什么?——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网&#xff0c;这个词汇在当今的科技领域已经变得耳熟能详。但当我们深入探索物联网的核心价值时&#xff0c;我们会发现它远不止是一个简单的技术概念&#xff0c;而是一种能够彻底改变我们生活方式和工作方式的革命性力量。 物联网…

libcurl 简单使用

LibCurl是一个开源的免费的多协议数据传输开源库&#xff0c;该框架具备跨平台性&#xff0c;开源免费&#xff0c;并提供了包括HTTP、FTP、SMTP、POP3等协议的功能&#xff0c;使用libcurl可以方便地进行网络数据传输操作&#xff0c;如发送HTTP请求、下载文件、发送电子邮件等…

C语言基础入门案例(3)

目录 第一题&#xff1a;一维数组的最大值和最小值求解 第二题&#xff1a;求一维数组中的第二大的数 第三题&#xff1a;计算5个整数的平均值 第四题&#xff1a;查找整数在数组中的索引位置 第五题&#xff1a;统计字符串中数字字符的个数 第一题&#xff1a;一维数组的…

服务器Linux搭建NPM私有仓库

服务器Linux搭建NPM私有仓库 环境搭建 安装 nodejs nodejs官网&#xff1a;https://nodejs.org/en/download/package-manager 可以去官网自行下载nodejs的Linux版本&#xff0c;但是出于别的原因考虑&#xff0c;可以使用nvm去下载nodejs这样会切换nodejs也方便。 nvm 这…

MySQL进阶-----limit、count、update优化

目录 前言 一、limit优化 1. 未优化案例 2.优化后案例 二、count优化 count用法 三、update优化 1.锁行情况&#xff08;有索引&#xff09; 2.锁表情况&#xff08;无索引&#xff09; 前言 上一期我们学习了order by优化和group by优化&#xff0c;本期我们就继续学习…

程序员接单的渠道有没有可靠介绍?

程序员接单的渠道有很多&#xff0c;但总结下来无非就是个人介绍和程序员接单平台。 这里就不多说废话了&#xff0c;直接上当前市面上靠谱且稳定的程序员接单平台list。 程序员客栈 近100w程序员都在使用的程序员接单平台。作为一个靠谱的线上接单渠道&#xff0c;程序员客栈…

SSRF靶场

SSRF概述 ​ 强制服务器发送一个攻击者的请求 ​ 互联网上的很多web应用提供了从其他服务器&#xff08;也可以是本地)获取数据的功能。使用用户指定的URL&#xff0c;web应用可以获取图片&#xff08;载入图片&#xff09;、文件资源&#xff08;下载或读取)。如下图所示&…

笔试题1 -- 吃掉字符串中相邻的相同字符(点击消除_牛客网)

吃掉字符串中相邻的相同字符 文章目录 吃掉字符串中相邻的相同字符题目重现解法一&#xff1a;(基于 erase() 函数实现)解法二&#xff1a;&#xff08;利用 栈 辅助实现&#xff09;总结 题目链接&#xff1a; 点击消除_牛客网 题目重现 牛牛拿到了一个字符串。 他每次“点击…