public class HeapSort {
public static void main(String[] args) {
Integer[] datas = {5,1,56,4,9,7,23,108,34,24,12};
sort(datas);
}
public static void sort(Integer[] datas) {
// 构建最大堆
buildMaxHeap(datas);
// 循环,每次把根节点和最后一个节点调换位置
for (int i = datas.length; i > 1; i--) {
Integer tmp = datas[0];
datas[0] = datas[i - 1];
datas[i - 1] = tmp;
for(Integer data : datas) {
System.out.print(data + "\t");
}
System.out.println();
// 堆的长度减少1,排除置换到最后位置的根节点
maxHeapify(datas, 1, i - 1);
}
}
// 根据输入数组构建一个最大堆
private static void buildMaxHeap(Integer[] data) {
// 其中有一般是叶子节点,不需要全部进行构建
for (int i = data.length / 2; i > 0; i--) {
maxHeapify(data, i, data.length);
}
}
//堆调整,使其生成最大堆
private static void maxHeapify(Integer[] data, int parentNodeIndex, int heapSize) {
// 计算左节点索引
int leftChildNodeIndex = parentNodeIndex * 2;
// 计算右节点索引
int rightChildNodeIndex = parentNodeIndex * 2 + 1;
// 最大节点索引
int largestNodeIndex = parentNodeIndex;
// 如果左节点存在并且左子节点大于父节点,则将左子节点作为最大节点
if (leftChildNodeIndex <= heapSize && data[leftChildNodeIndex - 1] > data[parentNodeIndex - 1]) {
largestNodeIndex = leftChildNodeIndex;
}
// 如果有节点存在并且右子节点比最大节点还大,那么最大节点应该是右子节点
if (rightChildNodeIndex <= heapSize && data[rightChildNodeIndex - 1] > data[largestNodeIndex - 1]) {
largestNodeIndex = rightChildNodeIndex;
}
// 最后,如果最大节点和父节点不一致,则交换他们的值
if (largestNodeIndex != parentNodeIndex) {
Integer tmp = data[parentNodeIndex - 1];
data[parentNodeIndex - 1] = data[largestNodeIndex - 1];
data[largestNodeIndex - 1] = tmp;
// 交换完父节点和子节点的值,对换了值的子节点检查是否符合最大堆的特性
maxHeapify(data, largestNodeIndex, heapSize);
}
}
}
分享到:
相关推荐
本代码主要演示了堆排序的排序方法,代码在centos7中测试通过。 编译方法使用g++ heapsort.cpp -o heapsort,运行heapsort即可
在这个代码中,`heapify`函数用于调整堆,`heapSort`函数首先通过`buildHeap`过程构建堆,然后通过不断地交换堆顶元素和末尾元素并调整堆来完成排序。 在数据结构的学习中,理解堆排序的原理和实现是至关重要的,...
heapsort
c语言实现堆排序算法 heapsort 排序算法 。采用随机产生100个数 利用堆排序 。排序1000次 计算排序用的时间。
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序的平均时间复杂度为Ο...
基于c++的堆积排序算法。排序算法大体可分为两种: 一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。 另一种是非比较排序,时间复杂度可以达到...
在这个"heapsort.rar"压缩包中,包含了一个名为"heapsort.cpp"的源代码文件,这应该是用C++语言实现的堆排序程序。下面,我们将深入探讨堆排序的基本原理、实现步骤以及其在C++中的应用。 堆排序的核心思想是建立一...
在本资料中,我们将深入探讨一种高效的排序算法——堆排序(HeapSort)。 **C语言** C语言是一种强大的、高效的编程语言,常用于系统编程、嵌入式系统以及各种应用软件的开发。它的语法简洁明了,适合编写底层算法...
本主题聚焦于C++实现的HeapSort(堆排序)算法,这是一种高效的、基于比较的排序方法。HeapSort利用了二叉堆的数据结构特性来实现排序,其过程分为两个主要阶段:构建最大(或最小)堆和交换堆顶元素。 **1. 堆的...
《严蔚敏数据结构与算法:HeapSort深度解析》 在计算机科学中,数据结构与算法是编程的基础,其中排序算法扮演着至关重要的角色。HeapSort(堆排序)是一种基于比较的排序算法,由Napier和Rabin于1964年提出,后经...
`heapsort`是一种基于堆的数据排序算法。其工作原理是首先将无序序列构造成一个大顶堆(或小顶堆),然后将堆顶元素与末尾元素交换,使末尾成为最大元素(或最小元素)。接着,对剩余n-1个元素重新调整为堆,再将堆...
自己写的一些简单算法和数据结构的代码 快排 堆排 归并 二分查找 单链表
**堆排序(HeapSort)**是计算机科学中一种重要的排序算法,尤其在数据结构与算法的学习中占据着核心地位。这个名为“09 HeapSort”的压缩包文件,显然包含了关于堆排序的具体实现,很可能是严蔚敏教授的数据结构课程...
标题中的"runoob-algorithm-HeapSort.zip"暗示了我们即将探讨的是关于堆排序(HeapSort)的算法。堆排序是一种高效的排序算法,属于比较排序的一种,它利用了计算机科学中的树形数据结构——堆。 堆是一个近似完全...
python 排序算法之HeapSort
C#实现heapSort.rar
C++实现heapSort.rar
C语言实现heapSort.rar
zoj 2665 Heapsort.md
1_HeapSort.java