写在前面:
一觉醒来,我就突然有灵感了......
最小二叉堆定义:
二叉堆是完全二元树或者是近似完全二元树,最小二叉堆是父结点的键值总是小于或等于任何一个子节点的键值的堆堆。
存储:
二叉堆一般用数组来表示。
根节点在数组中的位置是0,第n个位置的子节点分别在2n+1和 2n+2;
位置k的叶子的父节点位置为(k-1)/2;
实现:
/**
* @description 元素添加到末尾,和它的父节点比,如果比它小就交换
* @param array
*
* @author LynnWong
*/
private int[] getMinBinaryHeap(int[] array){
int N = array.length;
int minBinaryHeap[] = new int[N];
int root;//根的值
int heapSize = 0;//记录插入位置
for(int num : array){
minBinaryHeap[heapSize]=num;
++heapSize;
int pointer = heapSize-1;//当前指向的数组元素位置
while(pointer!=0){
int leafPointer = pointer;//叶子节点位置
pointer = (pointer-1)/2;//根节点位置
root = minBinaryHeap[pointer];//根节点
if(num>=minBinaryHeap[pointer]){//永远把当前数组元素看成叶子与其根比较或者换位
break;
}//如果根比叶子大 就交换位置
minBinaryHeap[pointer] = num;
minBinaryHeap[leafPointer] = root;
}
}
return minBinaryHeap;
}
/***
* 用随机数测试二叉堆排序
* 测试10遍,强迫症似的变态...
*/
public void text(){
for(int i=0;i<10;i++){
Random rnd = new Random();
int [] lala = {rnd.nextInt(6),rnd.nextInt(6),rnd.nextInt(6),rnd.nextInt(6),rnd.nextInt(6),rnd.nextInt(6)};
System.out.print("输入:");
for(int a : lala){
System.out.print(a+" ");
}
System.out.println();
int []array = this.getMinBinaryHeap(lala);
System.out.print("输出:");
for(int a : array){
System.out.print(a+" ");
}
System.out.println();
}
}
***********************大学不好好学习的格叽格叽*******************************
2013的第一篇,lysh 新年快乐!
分享到:
相关推荐
个人实现的最小权重的二叉堆实现,效率很高,适合任意场合下的临时列表排序。 可在外部写脚本对该文件进行测试 需要继承Tuple类实现排序对象类型,并实现Tuple的抽象方法weight()来反映排序对象权重
在Java中,二叉堆通常通过`PriorityQueue`类来实现。`PriorityQueue`是一个基于二叉堆的无界优先队列,它不支持并集操作,但提供了丰富的功能来处理元素的增删查改。下面我们将深入探讨二叉堆的核心概念和Java中的...
在实际应用中,二叉排序树常用于快速查找和排序,而堆则常用于实现优先级队列、求解最大/最小元素问题,如堆排序算法。结合二叉排序树和堆的概念,可以设计出更高效的数据结构和算法,例如二叉堆(一种同时满足二叉...
Java 实现最小二叉树堆排序的实例 在本文中,我们将详细介绍 Java ...本文通过 Java 实现最小二叉树堆排序的实例,详细介绍了二叉堆的定义、存储方式和实现代码,并提供了一个使用随机数测试二叉堆排序的示例代码。
在排序算法中,二叉堆是实现堆排序的基础,堆排序能在O(n log n)的时间复杂度内完成对一个无序数组的排序。 此外,二叉堆还用于图的最小生成树算法——Prim算法和Dijkstra算法中,用来找到当前未访问节点中与已访问...
在实际应用中,Java的`PriorityQueue`可以提供更简洁的实现方式,但手动实现有助于理解堆排序的工作原理。 总结起来,堆排序是一种高效的排序算法,时间复杂度为O(n log n),空间复杂度为O(1)。在Java中,我们可以...
根据提供的信息,我们可以深入探讨Java中的堆排序以及几种常见的排序算法。这包括堆排序、快速排序、冒泡排序和选择排序等。 ### 堆排序 堆排序是一种基于比较的排序算法,它利用了二叉堆的数据结构。二叉堆可以是...
### 堆排序算法详解及其Java实现 #### 一、堆排序概述 堆排序是一种非常高效的排序算法,它利用了二叉堆的数据结构来完成排序的过程。二叉堆可以分为最大堆和最小堆两种类型。最大堆指的是父节点的值总是大于或...
堆排序是一种基于二叉堆数据结构的排序算法,通过构建最大堆或最小堆,然后不断地取出堆顶元素并重新调整堆结构来实现排序。其算法步骤包括构建最大堆,交换堆顶元素和最后一个元素,调整堆结构,重复步骤直到堆的...
在这个主题中,我们将深入探讨堆排序的概念、工作原理以及如何用Java实现它。首先,我们需要理解堆是什么。 堆是一个近似完全二叉树的结构,并同时满足堆的性质:即父节点的键值或索引总是大于或小于(在最大堆和...
在Java中,实现堆排序通常涉及构建堆和进行排序两个主要步骤。 一、堆排序的基本原理 1. 建堆:首先将无序序列构建成一个大顶堆(升序时)或小顶堆(降序时)。对于大顶堆,根节点的值是整个堆中最大的,而小顶堆...
在Java中实现堆排序时,我们通常会采用大顶堆或者小顶堆来组织数据。堆排序的时间复杂度为O(n log n),空间复杂度为O(1)。 #### 二、堆排序的步骤 1. **构建初始堆**:将无序序列构造成一个大顶堆或小顶堆。 2. **...
堆排序是一种基于二叉堆数据结构的排序算法,其核心在于构建和维护最大堆或最小堆。在完全二叉树的结构中,最大堆确保每个节点的值都大于或等于其子节点的值,而最小堆则相反,每个节点的值小于或等于其子节点的值。...
堆排序是一种基于比较的排序算法,它利用了数据结构——二叉堆(最大堆或最小堆)的特性。二叉堆是一棵完全二叉树,满足堆的性质:父节点的值总是大于或等于(对于最大堆)其子节点的值。在最大堆中,根节点是堆中...
本文将深入探讨在JAVA中实现的各种排序算法,包括堆排序、归并排序、快速排序、基数排序、选择排序、冒泡排序、插入排序、希尔排序、计数排序和桶排序。 1. **堆排序**:堆排序是一种基于比较的排序算法,它利用了...
堆排序利用了二叉堆结构,将待排序序列构造成一个大顶堆或小顶堆,然后将堆顶元素与末尾元素交换,再调整堆,重复这个过程。时间复杂度为O(n log n),空间复杂度为O(1)。 7. 计数排序(Counting Sort) 计数排序...
堆排序利用了二叉堆这一数据结构。首先构建一个大顶堆(或小顶堆),然后将堆顶元素与最后一个元素交换,接着调整剩下的元素为新的堆,重复此过程直到所有元素都有序。堆排序的时间复杂度为O(n log n),空间复杂度...
堆排序利用了二叉堆的数据结构特性,将待排序的序列构造成一个大顶堆或小顶堆,然后交换堆顶元素与末尾元素,缩小排序范围,再重新调整堆。堆排序的时间复杂度为O(n log n),空间复杂度为O(1)。 7. **计数排序**...
这个“Binary_Heap_Demo.zip_DEMO”压缩包包含了Java实现的二叉堆示例代码,已经过测试,可以直接运行。 二叉堆分为两种类型:最大堆和最小堆。在最大堆中,每个节点的值都大于或等于其子节点的值,而在最小堆中则...
本文将详细介绍用Java语言实现的几种常见排序算法,包括插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序和堆排序。这些算法各有特点,适用于不同的场景,了解它们可以帮助我们更好地理解和优化代码...