java 实现 堆排序算法_C程序实现堆排序算法

java 实现 堆排序算法

Heap Sort is a comparison-based sorting algorithm that makes use of a different data structure called Binary Heaps. Let us understand some important terms,

堆排序是一种基于比较的排序算法,该算法利用称为二进制堆的不同数据结构。 让我们了解一些重要的术语,

  1. Complete Binary Tree: A tree is complete when all the levels (except of course the last level) are completely filled, i.e. all the parent nodes have two children nodes each and all the nodes are as far left as possible which means first we fill the left node and then the right.

    完整的二叉树 :当所有级别(当然,最后一个级别除外)都被完全填充时,即所有树的父节点都有两个子节点,并且所有节点都尽可能靠左,这意味着一棵树完成了。左节点,然后右。

  2. Binary Heap: It is a complete binary tree but there is an order of elements from parent to children in Binary Heap. They can be of two types,

    Binary Heap :这是一个完整的二叉树,但是Binary Heap中从父级到子级都有一个元素顺序。 它们可以有两种类型,

    1. Max Binary Heap or Max Heap where the parent node is greater than its two children nodes.
    2. 最大父节点大于其两个子节点的最大二进制堆或最大堆
    3. Min Binary Heap or Min Heap where the parent node is smaller than its children nodes.最小二进制堆或最小堆 ,其中父节点小于其子节点。
Heap Sort

The main() function of Heap Sort is to call the heapify() function which leads to the building of a max heap and then the largest element is stored in the last position of the array as so on till only one element is left in the heap. Array representation of heap is preferred because it occupies less space and also it is easy to reference the root and children nodes.

堆排序main()函数将调用heapify()函数,该函数将导致建立最大堆,然后将最大元素存储在数组的最后一个位置,依此类推,直到在数组中只剩下一个元素为止。堆。 堆的数组表示形式是首选的,因为它占用较少的空间,并且易于引用根节点和子节点。

Algorithm (Considering Max heap):

算法(考虑最大堆):

  1. First, we form a Max Heap such that the first node or the root node is the largest element. This step takes O(N) time complexity.

    首先,我们形成一个最大堆,以使第一个节点或根节点成为最大元素。 此步骤需要O(N)时间复杂度。

  2. Next, we swap the root element with the last element of the heap and reduce the size of heap by 1.

    接下来,我们将根元素与堆的最后一个元素交换,并将堆的大小减小1。

  3. Repeat steps 1 and 2 are till only 1 element is left.

    重复步骤1和2,直到仅剩1个元素。

How to build the Heap?

如何建立堆?

The heapify procedure can be applied to a node only when its children nodes are heapified. Therefore, we start the heapification with the last non-leaf node. To find the first non-leaf node, the following formula is used: First non-leafy node = lower bound (n/2)

仅当对子节点进行堆化时,才能将heapify过程应用于该节点。 因此,我们从最后一个非叶子节点开始堆化 。 要找到第一个非叶子节点,请使用以下公式: 第一个非叶子节点=下界(n / 2)

Hence, if there are 5 elements in the heap, the first non-leafy node would be the second node or the node at index 1.

因此,如果堆中有5个元素,则第一个非叶节点将是第二个节点或索引为1的节点。

Pseudo Code:

伪代码:

Heap_Sort (arr[], n)
{
// Creating the initial Max heap
for i = n/2 – 1 to 0:
heapify(arr, n, i)
// Swapping largest element and repeating the steps further
for i = n-1 to 0:
swap(arr[0], arr[i]
heapify(arr, n, i)
}
Heapify (arr[], n, i)
{
int largest = i;
int left = 2*i + 1; // Left child
int right = 2*i + 2; // Right child
// Check if left child exists and is larger than root
If (left < n && arr[left] > arr[largest]):
Largest = left;
// Check if right child exists and is larger than largest
If (right < n && arr[right] > arr[largest]):
largest = right;
// Change root, if root is not the largest
If(largest != i)
Swap(arr[i], arr[largest])
Heapify(arr, n, largest); //Repeat till max heap is obtained
}

Time Complexity:

时间复杂度:

The time complexity of Heap sort is:

堆排序的时间复杂度为:

  1. Worst Case = O(N log N)

    最坏情况= O(N log N)

  2. Average Case = Ɵ(N log N)

    平均情况=Ɵ(N log N)

  3. Best Case = Ω(N log N)

    最佳情况=Ω(N log N)

  4. Space Complexity: Ɵ(1)

    空间复杂度:Ɵ(1)

The time complexity of Heapify is O(log N) and that of Build_heap / Heap_Sort is O(N). The overall complexity of Heap_Sort is therefor, O(N log N).

Heapify的时间复杂度为O(log N),而Build_heap / Heap_Sort的时间复杂度为O(N)。 因此,Heap_Sort的总体复杂度为O(N log N)。

Heap Sort Implementation:

堆排序实现:

#include <stdio.h>
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void heapify(int arr[], int n, int i)
{
int left, right, largest;
largest = i;
left = 2 * i + 1;
right = 2 * i + 2;
// Check if left child exists and is larger than its parent
if (left < n && arr[left] > arr[largest])
largest = left;
// Check if right child exists and larger than its parent
if (right < n && arr[right] > arr[largest])
largest = right;
// if root is not the largest
if (largest != i) {
swap(&arr[i], &arr[largest]); //make root the largest
heapify(arr, n, largest); // Apply heapify to the largest node
}
}
void heap_sort(int arr[], int n)
{
int i;
for (i = (n / 2) - 1; i >= 0; i--)
heapify(arr, n, i);
for (i = n - 1; i >= 0; i--) {
swap(&arr[0], &arr[i]); //Move the largest element at root to the end
heapify(arr, i, 0); //Apply heapify to reduced heap
}
}
int main()
{
int arr[] = { 20, 13, 34, 56, 12, 10 };
int n = sizeof(arr) / sizeof(arr[0]);
printf("Array:\n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
heap_sort(arr, n);
printf("\nAfter performing Heap Sort:\n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}

Output:

输出:

Array:
20 13 34 56 12 10
After performing Heap Sort:
10 12 13 20 34 56

Applications:

应用范围:

  1. Job Scheduling: In Linux OS is used due to low space and time complexity

    作业调度 :由于空间和时间复杂度低,在Linux OS中使用

  2. Graph Algorithms: Djikstar's Algorithm, Prim's Algorithm and Huffman Coding

    图算法 :Djikstar算法,Prim算法和霍夫曼编码

翻译自: https://www.includehelp.com/c-programs/implement-heap-sort-algorithm.aspx

java 实现 堆排序算法

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

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

相关文章

b+树时间复杂度_数据结构:线性表,栈,队列,数组,字符串,树和二叉树,哈希表...

作者&#xff1a;张人大代码效率优化复杂度 -- 一个关于输入数据量n的函数时间复杂度 -- 昂贵与代码的结构设计有着紧密关系一个顺序结构的代码&#xff0c;时间复杂度是O(1), 即任务与算例个数 n 无关空间复杂度 -- 廉价与数据结构设计有关数据结构 -- 考虑如何去组织计算机中…

评价最高影片JAVAlibrary_视频 | 手游大神,动画导演,机圈新贵,极客怎么评价《愤怒的小鸟2》?...

谁能想到&#xff0c;迄今为止口碑最好的「游戏改编电影」竟然来自一个手机游戏IP&#xff1f;&#xff01;《愤怒的小鸟2》是有史以来评价最好的游戏改编电影。—— http://Screencrush.com《愤怒的小鸟2》凭什么能在打分平台上获得游戏改编电影最高分&#xff1f;—— http:/…

如何安装_如何安装吸顶灯?吸顶灯安装注意事项

摘要&#xff1a;灯是我们每个家庭都有的照明装置&#xff0c;它的造型和光能效果能直接影响到家居生活的氛围、美观度以及健康状况。吸顶灯的造型功能也随着科技的发展在不断发生多元化的改变。如今市面上的吸顶灯既有简单的装置又不比吊灯少了时尚奢华&#xff0c;让在层高较…

win10虚拟网络服务器,win10 虚拟专用网络服务器配置

win10 虚拟专用网络服务器配置 内容精选换一换本节将介绍在华为云关系型数据库服务的管理控制台创建实例的过程。目前&#xff0c;RDS for SQL Server支持“包年/包月”和“按需计费”购买&#xff0c;您可以根据业务需要定制相应计算能力和存储空间的华为云关系型数据库实例。…

easyui的textbox实现编辑保存_第80讲:工作表数据与UserForm窗口的交互,记录的编辑和保存...

大家好&#xff0c;我们今天继续讲解VBA数据库解决方案&#xff0c;今日讲解的是第80讲:工作表数据与UserForm窗口的交互过程中&#xff1a;如何对显示的记录进行编辑和保存。在前几讲中&#xff0c;我们实现了将工作表的数据传给UserForm窗口&#xff0c;实现的开始记录、下一…

jsp管理系统页面模板_jsp+ssh(spring+struts2+hibernate)+mysql实现的高校实验室管理系统...

今天给大家演示的是一款由jspssh(springstruts2hibernate)mysql实现的高校实验室管理系统本系统后端采用ssh框架&#xff0c;前端采用bootstrap和layui框架&#xff0c;界面美观大气。主要实现的功能有&#xff1a;1&#xff1a;教师和学生登录注册(超级管理员内置)。2&#xf…

小程序服务器获取appid,微信小程序小程序appid如何获取

经常有人问微信小程序的appid如何获取&#xff1f;小程序appid是小程序对应的id&#xff0c;通过小程序后台可以简单查询到。1、如果这个小程序是你做的小程序管理员进入公众平台、使用小程序帐户登录后&#xff0c;点击左侧菜单中的「设置」&#xff0c;在「开发设置」一项&am…

电脑模拟器哪个好_电脑系统杀毒软件哪个好测评

如果你不知道选择哪个杀毒软件的话&#xff0c;今天笔者就来告诉你杀毒软件哪个好&#xff0c;一起来看看杀毒软件排行榜吧。1、360杀毒。该软件拥有木马查杀、清理插件、漏洞修复、电脑体检等等多种功能。2、金山毒霸。该软件融合了启发式搜索、代码分析和虚拟机病毒查找等技术…

avr flash_AVR | USART家庭自动化

avr flashThe Universal Synchronous and Asynchronous serial Receiver and Transmitter (USART) is a highly flexible serial communication device. The main features are: 通用同步和异步串行接收器和发送器(USART)是一种高度灵活的串行通信设备。 主要特点是&#xff1a…

diskgenius 数据迁移_活见鬼,明明删除了数据,空间却没减少! - *IT界农民工*

迁移数据常用1、导出文件 - mysqldump 命令 ‍mysqldump 是 Mysql 自带的逻辑备份工具。其备份原理是通过协议连接到 Mysql 数据库&#xff0c;将需要备份的数据查询出来转换成对应的 insert 语句。当需要还原这些数据时&#xff0c;只要执行这些 insert 语句&#xff0c;即可将…

iphone短信尚未送达_第五期:从苹果 乔布斯 iPhone 说到张小龙 微信 理财通

这篇评测我是怀着敬畏之心写的。第一部分&#xff1a;从设计理念说起(一)说到设计理念&#xff0c;不得不先说下苹果的iPhone一)第一代iPhone于2007年1月9日由苹果公司前首席执行官史蒂夫乔布斯发布&#xff0c;并在2007年6月29日正式发售。让我们看一下第一代iPhone的几个细节…

declare begin end 中if怎么写_习语系列第45期:”未雨绸缪“英语怎么说?

背景介绍&#xff1a;英语习语是指一系列特定词的组合&#xff0c;但从字面上看不容易被理解。广义的习语包括短语动词、俚语、谚语、行话等。这为我们参加四六级、雅思、托福、GRE/GMAT考试做阅读理解题时带来了不少困难。抛开考试不谈&#xff0c;如果只是想单纯地读懂经济学…

python在哪个城市工资高_专硕好还是学硕好?哪个更好就业工资高?

最近有备考的小伙伴咨询关于学硕和专硕的问题&#xff0c;一篇旧文分享下。昨天的文章专硕学费贵那么多会比学硕学的东西多吗&#xff1f;九大美院研究生学费对比(点击查看)受到了不少小伙伴的关注&#xff0c;大家就专硕和学硕的问题提出了不少疑义。有人认为专硕好&#xff0…

comparator比较器用法_汽车三元催化器堵塞咋办?不拆不换,用这招清理干净、动力猛如虎...

如今汽车的价格是不断走低&#xff0c;很多人也能如愿成为有车人群。如今国庆假期即将到来&#xff0c;在国庆前买了车的朋友就能在长假里开着汽车出去好好游玩一番&#xff0c;这过程是想想都觉得美妙。不过作为车主&#xff0c;汽车不单要懂得开&#xff0c;也要学会保养&…

51单片机怎么显示当前时间_51单片机玩转物联网基础篇06-LCD1602液晶显示器

前言本节我们开始学习LCD1602&#xff0c;LCD1602是字符型液晶显示屏&#xff0c;在实际项目中应用非常广泛&#xff0c;学完本节就可以逐步开发一些好玩的应用了。一、基础知识1.LCD1602简介LCD1602是字符型液晶显示模块&#xff0c;专门用于显示字母、数字、符号等点阵式LCD&…

联想服务器如何u盘启动盘装系统,联想如何设置u盘启动

相信有不少网友都在使用联想电脑&#xff0c;它的性价比一直受到不少消费者的青睐。接下来教大家联想如何设置u盘启动&#xff0c;希望大家能喜欢。联想如何设置u盘启动步骤阅读1、按快捷键弹出启动选项&#xff0c;联想笔记本一般是F12或者F22、按TAB键切换App Menu菜单&#…

c语言负数左移右移_C语言 位运算符的运算规则

位运算是指按照二进制进行的运算&#xff0c;在C语言中&#xff0c;提供了6种的位运算符&#xff0c;他们分别是按位与&#xff08;&&#xff09;&#xff0c;按位或&#xff08;|&#xff09;&#xff0c;按位异或&#xff08;^&#xff09;&#xff0c;按位取反&#xff…

的标题形状工具在哪里_自媒体如何搜集素材?标题、文章、图片素材收集3大途径!...

文&#xff1a;老彭自媒体大家好&#xff0c;我是老彭&#xff0c;很多人觉得做自媒体写内容很难&#xff0c;每天想写点东西又感觉无从下手&#xff0c;那么到底是什么原因造成的呢&#xff1f;其实最主要的原因还是自己平时看的太少&#xff0c;和素材储备不足所导致的。大家…

小样本点云深度学习库_合成鲁棒的对抗样本来欺骗深度学习分类器

本期一诺sec关注深度学习系统安全问题&#xff0c;推荐一篇来自ICML 2018会议论文Synthesizing Robust Adversarial Examples。论文链接http://proceedings.mlr.press/v80/athalye18b.html。深度模型对于对抗样本具有高度的脆弱性&#xff0c;这已经是得到大家印证的事实。自从…

java数据类型_JAVA基础篇(数据类型)

首先请大家想想这几个问题&#xff1a;1.java数据类型是什么&#xff1f;2.Java数据类型有什么用&#xff1f;上一节&#xff08;JAVA基础篇&#xff08;函数&#xff09;&#xff09;有个add函数&#xff0c;里面有两个int类型&#xff0c;int类型就是整数的意思&#xff0c;这…