堆的定义如下:
n个元素的序列{k0,k1,...,ki,…,k(n-1)}当且仅当满足下关系时,称之为堆。
" ki<=k2i,ki<=k2i+1;或ki>=k2i,ki>=k2i+1.(i=1,2,…,[n/2])"
若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,
则完全二叉树中每一个节点的值的都大于或等于任意一个字节的值(如果有的话),称之为大顶堆。
则完全二叉树中每一个节点的值的都小于或等于任意一个字节的值(如果有的话),称之为小顶堆。
由此,若序列{k0,k1,…,k(n-1)}是堆,则堆顶元素(或完全二叉树的根)必为序列中n个元素的最小值(或最大值)。
倘若给堆中每一个节点都赋予一个整数值标签,根节点被标记为0,对于每一个标记为i的节点,其左子节点(若存在的话)被标记为2*i+1,其右子节点(若存在的话)被标记为2*i+2,对于一个标记为i的非根节点,其父节点被标记为(i-1)/2。使用这个标记,我们能够将堆存储在数组中,节点存储在数据中的位置就使其标签。
排序包含两个过程:
(1)初建堆
(2)调整堆
调整堆:对于第二个过程,描述如下,第一次,取出堆顶元素与R[n]进行交换,然后从根结点开始调整堆,根结点与左右孩子中较大者交换,这样,左右子树的堆会被破坏,继续进行上述操作,直到叶子结点为止。第二次,取出堆顶元素与R[n-1]交换,然后调整堆。
初建堆:从非终端结点开始一直到根结点,执行调整堆的过程。这样,就会建立一个大顶堆。
堆的调整 实际上简单理解就是 确保是一颗完全二叉树,即所有的父节点必须大于等于左右孩子。
堆调整之后,再进行堆排序。
如 数组 [2 7 3 5 6 9] 二叉树为
2
7 3
5 6 9
9 是大于 父节点 3 的,所以需要调整
堆排序算法的JAVA实现:
/**
* 堆排序包括两个步骤 (1)初始堆(堆的定义:(1)堆是一个完全二叉树(2)根结点的值或者大于左右子树的值或者小于左右子树的值(3)左右子树也是一个堆)
* (2)调整堆(当初始小顶堆之后,堆顶元素是最小的元素,取出最小的元素与最后一个元素相交换,再把剩下n-1个元素调整成堆,依次调整直到1为止)
* 非终端节点调整 初始堆时从n/2向上调整成堆 把第一个元素与最后一个元素交换之后从第1个元素开始调整成新堆
*
package collections;
public class HeapSorter {
public static void heapSort(int[] array){
buildHeap(array);//构建堆
int n = array.length;
int i=0;
for(i=n-1;i>=1;i--){
swap(array,0,i);
heapify(array,0,i);
}
}
public static void buildHeap(int[] array){
int n = array.length;//数组中元素的个数
for(int i=n/2-1;i>=0;i--)
heapify(array,i,n);
}
public static void heapify(int[] A,int idx,int max){
int left = 2*idx+1;// 左孩子的下标(如果存在的话)
int right =2*idx+2;// 左孩子的下标(如果存在的话)
int largest = 0;//寻找3个节点中最大值节点的下标
if(left<max && A[left]>A[idx])
largest = left;
else
largest = idx;
if(right<max && A[right]>A[largest])
largest = right;
if(largest!=idx){
swap(A,largest,idx);
heapify(A,largest,max);
}
}
public static void swap(int[] array,int i,int j){
int temp =0;
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
public static void main(String[] args) {
int[] a = {1,2,3,4,5,6,7,16,9,10,11,12,13,14,15,8};
System.out.println("排序前..........................");
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
System.out.println();
heapSort(a);
System.out.println("排序后..........................");
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
}
}
分享到:
相关推荐
根据提供的信息,我们可以深入探讨Java中的堆排序以及几种常见的排序算法。这包括堆排序、快速排序、冒泡排序和选择排序等。 ### 堆排序 堆排序是一种基于比较的排序算法,它利用了二叉堆的数据结构。二叉堆可以是...
Java堆排序是一种基于比较的排序算法,其核心思想是构建一个大顶堆或小顶堆,然后通过调整堆结构来达到排序的目的。在给定的代码中,`HeapSort` 类实现了堆排序的过程。 1. **堆排序流程**: - 首先,将待排序的数...
【Java堆排序原理】 堆排序是一种高效的排序算法,基于完全二叉树的堆数据结构。在Java中,堆排序能够实现原地排序,即不需要额外的存储空间,且时间复杂度为O(nlogn)。然而,由于它不是稳定的排序算法,相同元素的...
Java实现堆排序不是C,Java实现堆排序不是C,Java实现堆排序不是C,Java实现堆排序不是C
Java 写得最大堆排序代码,给大家参考下,自己刚写的。
"java堆排序原理与实现方法分析" Java 堆排序是一种基于完全二叉树的排序算法,它可以将数组中的元素排序为递增或递减的顺序。下面将详细介绍 Java 堆排序的原理与实现方法。 堆排序原理 堆是一个数组,被看成一...
堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆排序7.java 使用java实现的堆排序堆...
以下是一个简单的Java堆排序算法实现的伪代码: ```java class HeapSort { void heapify(int arr[], int n, int i) { // 代码实现下沉操作 } void swap(int arr[], int i, int j) { // 代码实现元素交换 } ...
在JAVA中,堆排序可以通过递归或非递归方式实现。非递归方式通常需要借助循环结构来模拟递归过程。由于堆排序的非递归实现比递归实现更为复杂,需要我们手动控制循环的迭代次数和条件,因此在理解堆排序算法的逻辑时...
"Java堆排序算法详解" Java堆排序算法是将原始数据转换为堆的形式,然后重复地删除堆顶元素,并将其插入到有序的序列中,以达到排序的目的。下面是Java堆排序算法的知识点总结: 1. heap的概念:堆是一种特殊的...
"java堆排序概念原理介绍" java堆排序是一种基于比较的排序算法,它通过构建一个堆来实现排序。下面是关于java堆排序概念原理的详细介绍: 什么是堆排序 堆排序是一种基于比较的排序算法,它通过构建一个堆来实现...
Java中的堆排序是一种基于比较的排序算法,它利用了数据结构——堆的特性来实现排序。堆是一个近似完全二叉树的结构,并且满足堆的性质:即父节点的键值总是大于或等于(或者小于或等于)其子节点的键值。在这个例子...
堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用...
堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆排序10.java 使用java来实现堆...
堆排序算法的java实现,采用大根堆。时间复杂度为O(nlogn).
"JAVA堆排序算法的讲解" JAVA堆排序算法是基于堆数据结构的一种选择排序算法,它的最坏、最好、平均时间复杂度均为O(nlogn),是一种不稳定排序。堆排序的基本思想是将待排序序列构造成一个大顶堆,此时,整个序列...
java的堆排序算法实现程序,含测试,可直接运行。java的堆排序算法实现程序,含测试,可直接运行。
堆排序算法 java
Java 堆排序实例(大顶堆、小顶堆) 在计算机科学中,堆排序是一种基于堆这种数据结构的排序算法。堆是一种近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆...
以下是Java实现堆排序的基本步骤: 1. 构建大顶堆:从最后一个非叶子节点(即最后一个元素的父节点)开始,自底向上、自右向左进行调整,确保每个节点都大于或等于其子节点。 2. 交换堆顶元素与末尾元素:将最大...