堆是一种特殊的数据结构,是一种完全二叉树,分为大根堆(根节点的值大于孩子节点)和小根堆(根节点小于孩子节点),建堆和堆排序代码如下:
package cn.com.daydayup.test;
public class StackSort {
public static void main(String[] args) {
int[] a = { 26, 5, 77, 1, 61, 11, 59, 15, 48, 19 };
Sort(a);
}
//堆排需方法
public static void Sort(int[] a) {
int n = a.length;//取得数组总长度,及堆最大的序号
int temp = 0;
Display(a, "Before sort : ");
//这是建堆的过程,一次从倒数第二层的根节点开始调整堆,即数组下标为i/2开始,一直到顶层根节点,这样就建好堆了。。
for (int i = n / 2; i > 0; i--) {
Adjust(a, i - 1, n);//从倒数第二层的最后一个根节点开始调整堆
Display(a, "建立大根堆 : ");
}
System.out.println("---------------------------------------");
for (int i = n - 2; i >= 0; i--) {//这是堆排序的具体算法,思想是每次取出堆的最顶层根节点,即数组下标为0,然后与最后一个节点即i+1交换,这样对于大根堆而言,最大值总是在后面。。循环过后就能排序了。。
temp = a[i + 1];//取出最后一个元素
a[i + 1] = a[0];//取出第一个元素,即顶层根节点
a[0] = temp;//交换位置
Adjust(a, 0, i + 1);//调整堆
Display(a, "重建立大根堆 : ");
}
Display(a, "After sort : ");
}
/**
* 调整堆的方法
* @param a 要调整的数组,即堆
* @param i 调整的根节点,即起始位置
* @param n 要调整的终止位置
*/
public static void Adjust(int[] a, int i, int n) {
int j = 0;
int temp = 0;
temp = a[i]; //取出根节点
j = 2 * i + 1; //左孩子节点
while (j <= n - 1) {
if (j < n - 1 && a[j] < a[j + 1])//比较左右孩子,取出较大的孩子
j++;
if (temp >= a[j]) //如果根节点大于孩子节点则退出循环,不用调整
break;
a[(j - 1) / 2] = a[j];//较大的孩子节点值赋值给根节点
j = 2 * j + 1;//继续寻找左孩子
}
a[(j - 1) / 2] = temp;//将根节点赋值给最后一个空出来的节点
}
//打印堆内容
public static void Display(int[] a, String str) {
System.out.println(str);
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
}
}
分享到:
相关推荐
本主题将深入探讨四种常见的排序算法:堆排序、快速排序以及两种未在标题中明确提到但同样重要的排序方法——基数排序和计数排序。 首先,让我们详细了解一下堆排序。堆排序是一种基于比较的排序算法,利用了数据...
堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和...
简单的堆排序算法:以定长数组为例,动态数组等可以以此类推
十大经典排序算法堆排序详细图解(通俗易懂)十大经典排序算法堆排序详细图解(通俗易懂)十大经典排序算法堆排序详细图解(通俗易懂)十大经典排序算法堆排序详细图解(通俗易懂)十大经典排序算法堆排序详细图解...
堆排序是一种基于比较的排序算法,它通过构造一个大顶堆或小顶堆来实现排序。在本场景中,我们关注的是堆排序的源代码,它适用于openSUSE 11.4操作系统,并且是使用GCC version 4.5.1编译器编译的。在这个名为"sort...
堆排序详细图解(通俗易懂)+排序算法----堆排序(超详细)堆排序详细图解(通俗易懂)+排序算法----堆排序(超详细)堆排序详细图解(通俗易懂)+排序算法----堆排序(超详细)堆排序详细图解(通俗易懂)+排序算法...
本文将深入探讨四种在C++中实现的常见排序算法:插入排序、冒泡排序、堆排序和快速排序。这些算法各有特点,适用于不同的场景,理解并掌握它们对于提升编程能力至关重要。 1. **插入排序**: 插入排序是一种简单的...
堆排序是一种基于比较的排序算法,它通过构造一个近似完全二叉树的堆数据结构来实现排序。在计算机科学中,堆是一个可以被看作是一棵树形结构的数据集合,其中每个父节点的值都大于或等于其子节点的值(大顶堆)或...
本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...
堆排序是一种基于比较的排序算法,它利用了数据结构中的“堆”这一概念。在计算机科学中,堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。堆排序有两种...
最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法
一个堆排序算法 c++写的 逻辑相同 可自行 改为java 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一...
本文将详细介绍C++中实现的希尔排序、快速排序、堆排序和归并排序这四种经典排序算法。 希尔排序,由Donald Shell于1959年提出,是一种改进的插入排序。它的基本思想是通过设置一个增量序列,将待排序的元素按照...
本文将对快速排序、归并排序、堆排序等常见排序算法进行比较和分析,探讨它们的优缺点和适用场景。 首先, let's 看一下这些排序算法的时间复杂度和空间复杂度: | 排序算法 | 平均情况 | 最好情况 | 最坏情况 | ...
本话题主要探讨六种内部排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序以及堆排序。这六种排序算法各有优劣,适用于不同的场景,接下来我们将逐一进行详细阐述。 1. **直接插入排序**: 直接...
C语言实现的堆排序算法。 提供了堆排序算法的一个接口,可以为其它功能提供功能。
堆排序是一种基于比较的排序算法,它通过构造一个近似完全二叉树的堆结构来实现数据的排序。在此,我们将深入探讨堆排序的基本概念、原理以及如何通过编程实现。 一、堆排序的概念 堆是一个近似完全二叉树的结构,...
堆排序是一种基于比较的排序算法,其基本思想是利用二叉堆这一数据结构来实现数组或链表的排序。在计算机科学中,二叉堆通常可以分为最大堆和最小堆,最大堆中每个父节点的值都大于或等于其子节点的值,而最小堆则...
堆排序算法 java
java的堆排序算法实现程序,含测试,可直接运行。java的堆排序算法实现程序,含测试,可直接运行。