Java实现堆

news/2024/11/8 1:31:41/

堆是一种基于完全二叉树的数据结构,它分为大根堆和小根堆。在大根堆中,每个节点的值都大于或等于其子节点的值;而在小根堆中,每个节点的值都小于或等于其子节点的值。

在Java中,我们可以使用数组来表示堆。由于完全二叉树的性质,我们可以将堆的节点按照从上到下、从左到右的顺序对应到数组中。假设堆的根节点在数组中的下标为0,则其左孩子的下标为2i+1,右孩子的下标为2i+2,父节点的下标为(i-1)/2。

以下是使用Java实现堆的代码:

public class Heap {private int[] heap;   // 堆private int size;     // 堆的大小public Heap(int[] heap) {this.heap = heap;this.size = heap.length;buildHeap();}// 堆排序public void sort() {while (size > 1) {swap(0, size - 1);size--;heapify(0);}}// 构建堆private void buildHeap() {for (int i = (size - 2) / 2; i >= 0; i--) {heapify(i);}}// 堆化private void heapify(int i) {int left = 2 * i + 1;int right = 2 * i + 2;int max = i;if (left < size && heap[left] > heap[max]) {max = left;}if (right < size && heap[right] > heap[max]) {max = right;}if (max != i) {swap(i, max);heapify(max);}}// 交换元素private void swap(int i, int j) {int temp = heap[i];heap[i] = heap[j];heap[j] = temp;}
}

上述代码实现了一个最大堆,堆的大小为数组的长度。堆排序的思路与普通的堆排序一致,先建立堆,然后每次将堆顶元素与堆底元素交换,缩小堆的大小,并重新堆化。

对于一个包含n个元素的数组,建立堆的时间复杂度为O(n),堆排序的时间复杂度为O(nlogn)。由于堆排序的空间复杂度为O(1),因此它是一种原地排序算法。


http://www.ppmy.cn/news/1251772.html

相关文章

Rust之构建命令行程序(一):接受命令行参数

开发环境 Windows 10Rust 1.73.0 VS Code 1.84.2 项目工程 这次创建了新的工程minigrep. IO工程&#xff1a;构建命令行程序 这一章回顾了到目前为止你所学的许多技能&#xff0c;并探索了一些更标准的库特性。我们将构建一个与文件和命令行输入/输出交互的命令行工具&#…

java学校高校运动会报名信息管理系统springboot+jsp

课题研究方案&#xff1a; 结合用户的使用需求&#xff0c;本系统采用运用较为广泛的Java语言&#xff0c;springboot框架&#xff0c;HTML语言等关键技术&#xff0c;并在idea开发平台上设计与研发创业学院运动会管理系统。同时&#xff0c;使用MySQL数据库&#xff0c;设计实…

C\C++:原子计数操作 之__syn_fetch_and_add性能研究

背景 首先在多线程环境中&#xff0c;多线程计数操作&#xff0c;共享状态或者统计相关时间次数等&#xff0c;这些需要在多线程之间共享变量和修改变量&#xff0c;如此就需要在多线程间对该变量进行互斥操作和访问。 但是如果我们要维护一个全局的线程安全的 int 类型变量 co…

UniPro集成华为云WeLink 为企业客户构建互为联接的协作平台

华为云WeLink是华为开启数字化办公体验、帮助企业实现数字化转型的实践&#xff0c;类似钉钉。UniPro的客户企业中&#xff0c;有使用WeLink作为协作工具的&#xff0c;基于客户的实际业务需求&#xff0c;UniPro实现了与WeLink集成的能力&#xff0c;以帮助客户企业丰富和扩展…

netstat和ps命令

查看端口占用情况 netstat -apn | grep 9091 Proto Recv-Q Send-Q Local Address Foreign Address State tcp6 0 0 127.0.0.1:9091 127.0.0.1:36644 ESTABLISHED 83369/./pushgateway意思为 127.0.0.1:36644 通过进…

python中的序列类型

文章目录 字符串列表元组由元组构成的列表 字符串 字符串是编程语言中的一种基本数据类型&#xff0c;用于表示一串字符序列。在Python中&#xff0c;字符串是不可变的&#xff0c;也就是说一旦字符串被创建&#xff0c;就无法修改其中的字符。 Python中的字符串可以用单引号…

C++学不会?一篇文章带你快速入门

1. 命名空间 1.1 命名空间的概念 C命名空间是一种用于避免名称冲突的机制。它允许在多个文件中定义相同的函数、类或变量&#xff0c;而不会相互干扰。 1.2 命名空间的定义 namespace是命名空间的关键字&#xff0c;后面是命名空间的名字&#xff0c;然后后面一对 {},{}中即…

python音频处理wavfile VS. librosa

数据读取 ## 音频载入 import librosa from scipy.io import wavfile# wavfile wav_file demo.wav wf_sr, wf_audio wavfile.read(wav_file) # R1. wf_audio为未经归一化的原始音频采样点&#xff0c; 一般采用int16编码&#xff0c;即[-32768, 32767]# librosa # R1. 若sr不…