1、堆数据结构是一种数组对象。
2、该数组对象的两个属性:
length【A】数组元素的个数
heap-size【A】存放在A中的堆的元素个数
3、父节点与其左右子节点的关系:
父节点:parent(i)
return i/2;
左子节点:getLeftChild(i)
return 2*i+1;
右子节点:getRightChild(i)
return 2*i+2;
4、最大堆的特性:(堆排序)
A[PARENT(i)]>=A[i];
最小堆的特性:(优先队列)
A[PARENT(i)]<=A[i];
5、堆排序:
1.建堆:
Build_heap(A)
heap_size(A)<--length[A]
for i<--取整[length[A]/2]-1
do Max_heapify(A,i)
2.调整堆:
Max_heapify(A,i)
left<-getLeftChild(i)
right<-getRightChild(i)
if left<=heap_size[A]&&A[left]>A[i]
then largst<-left
else largst<-i
if right<=heap_size[A]&&A[right]>A[i]
then largst<-right
if largst != i
then exchange A[i]<-->A[largst]
Max_heapify(A,largst)
3.堆排序:
HeapSort(A)
Build_heap(A)
for i<--length[A]-1
do exchange A[0]<---heap_size[A]-1
Max_heapify(A,i)
6、Java代码实现:
public class HeapSort
{
/**
* 堆排序的方法
* @param array
*/
public static void heapSort(int a[],int alen)
{
int hlen=alen;
int temp;
//1、建堆
BuildHeap(a,hlen);
for(int i=alen-1;i>=0;i--)
{
temp=a[0];//将数组的最后一个元素与第一个元素交换
a[0]=a[i];
a[i]=temp;
hlen--; //堆长度减1
Max_HeapIFY(a,hlen,0);//调整堆
}
}
/**
* 建堆的方法
*/
public static void BuildHeap(int a[],int hlen)
{
int begin=hlen/2-1;
for(int i=begin;i>=0;i--)
{
Max_HeapIFY(a,hlen,i);
}
}
/**
* 调整堆的方法
*/
public static void Max_HeapIFY(int a[],int hlen,int i)
{
int left=getLeftChild(i);
int right=getRightChild(i);
int largst =i;
int temp;
if(left<hlen&&a[largst]<a[left])
{
largst=left;
}
if(right<hlen&&a[largst]<a[right])
{
largst=right;
}
if(i!=largst)
{
temp=a[largst]; //将值最大的数与当前数交换
a[largst]=a[i];
a[i]=temp;
//在获取当前的左右孩子节点
Max_HeapIFY(a,hlen,largst);
}
}
/**
* 获取左孩子节点
*/
public static int getLeftChild(int i)
{
return 2*i+1;
}
public static int getRightChild(int i)
{
return 2*i+2;
}
public static void main(String[] args)
{
int a[]={16,4,10,14,7,9,3,2,8,5,1,5,33,45,323,2323,876};
int alen=a.length;
//未排序的顺序
System.out.println("未排序时,数组元素的顺序:");
for(int i=0;i<alen;i++)
{
System.out.print(a[i]+" ");
}
System.out.println();
System.out.println("排序后,数组元素的顺序:");
heapSort(a,alen);
//排序后的顺序
for(int i=0;i<alen;i++)
{
System.out.print(a[i]+" ");
}
System.out.println();
System.out.println("数组中最大的十个数为:");
for(int i=alen-1;i>=alen-10;i--)
{
System.out.print(a[i]+" ");
}
}
}
分享到:
相关推荐
6. **堆排序**:利用二叉堆数据结构实现的排序算法。堆排序首先将数组构造成一个大顶堆或小顶堆,然后将堆顶元素与末尾元素交换,调整剩余元素为新堆,重复此过程,直至整个数组排序完成。堆排序的时间复杂度为O(n ...
堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现...
6. 堆叠+LAG 结合使用可以提高设备级的可靠性。 7. 堆叠+LAG 结合使用也可以增加链路带宽,避免单线路故障和转发延迟。 堆叠技术的缺点包括: 1. 故障率高,单主控板出现问题,可能会导致备份主控板无法接管的问题...
6. 堆叠配置举例 堆叠配置举例包括组网需求、配置思路、配置过程等。例如,在组网中需要实现高可靠性和高带宽的数据转发,可以使用堆叠配置来实现。 7. 堆叠的应用场景 堆叠的应用场景包括:提高可靠性、扩展端口...
#### 6. 堆排序算法实现 以下是一个简单的堆排序算法实现的伪代码: ```plaintext function heapSort(arr): n = length(arr) // 构建大根堆 for i from n/2 downto 1: heapify(arr, n, i) // 一个个从堆顶...
6. 堆排序(Heapsort):小根堆可以用于实现高效的排序算法——堆排序。首先,构造一个小根堆,然后反复将堆顶元素(最小元素)与末尾元素交换,再调整堆,直至所有元素都在堆中正确排序。 7. 堆的优化:在实际应用...
6. 堆在实际问题中的应用,如优先队列和Top-K问题。 通过学习和掌握这些知识,你将能够自信地面对面试中关于树和堆的挑战,提升你的求职竞争力。同时,实践编程练习和解决实际问题也是巩固理论知识的关键。
6.堆叠技术的目的和应用场景 7.VRRP 技术的概念和应用场景 详细说明: 以太网链路聚合是指将多个物理接口捆绑成为一个逻辑接口,以达到增加链路带宽的目的。这项技术可以解决单点故障问题,避免因某个链路或者某个...
6. 堆排序的优势与局限: - 优势:堆排序的时间复杂度较低,对于大数据量的排序效率较高,且空间复杂度低,适合原地排序。 - 局限:堆排序不是稳定的排序算法,相等的元素可能会改变原有的相对顺序。此外,由于...
1. 冒泡排序(Bubble Sort) ...6.堆排序(Heap Sort) 7. 计数排序(Counting Sort) 8. 桶排序(Bucket Sort) 9. 基数排序(Radix Sort) 10. 希尔排序(Shell Sort) 解压密码 douge
6. 堆肥化过程的阶段: 堆肥化过程大致可分为四个阶段:潜伏阶段(微生物适应期)、中温阶段(约45℃以下,主要分解易降解有机物)、高温阶段(45℃以上,降解纤维素等难降解物质,杀死病原体)和降温腐熟阶段...
**6. 堆排序** 堆排序利用了堆这种数据结构。首先构建一个大顶堆(或小顶堆),然后将堆顶元素与末尾元素交换,再调整堆,如此反复,直到所有元素排序完成。堆排序的时间复杂度为O(n log n),且是稳定的排序算法。 ...
1.基本思想 2.排序过程 3.代码实现 4.如何优化 5.复杂度 6.使用场景 1.基本思想 2.排序过程 1.先将初始文件R[1..n]建成一个大根堆,此堆
6. 堆:是一种特殊的完全二叉树,满足堆属性,即父节点的值总是大于或等于(最小堆)或小于或等于(最大堆)其子节点的值。堆常用于优先队列的实现。 7. 散列表(哈希表):通过哈希函数将键映射到数组的索引上,...
6. 堆排序:利用堆数据结构,维护一个最大堆或最小堆,每次取出堆顶元素并调整堆,时间复杂度为O(n log n)。 7. 计数排序、基数排序和桶排序:这些是非比较型排序,适用于特定类型的输入数据,如整数或范围有限的值...
6. 堆排序:利用堆结构进行排序,时间复杂度为O(nlogn)。 7. 计数排序、桶排序、基数排序等线性时间复杂度的非比较排序算法,适用于特定场景。 二、查找算法 查找算法用于在数据集合中寻找特定元素: 1. 线性查找:...
6. 堆:如优先队列的实现。 7. Trie树:用于字符串查找,分为静态建树和动态建树,如POJ2513。 四、简单搜索 1. 深度优先搜索(DFS):如POJ2488。 2. 广度优先搜索(BFS):如POJ3278。 3. 搜索技巧和剪枝:优化...
6. 堆内存的调整: - 初始堆大小(-Xms):JVM启动时设置的堆内存大小。 - 最大堆大小(-Xmx):JVM允许的最大堆内存大小。 - 对于64位JVM,堆内存大小可以设置为4GB,Windows下推荐设置为1.5G-2G,Linux下为2G-...
6. 堆内存比较:对比不同时间点或不同条件下的堆内存状态,找出差异。 使用heapview插件,开发者可以在不离开IDEA的环境下进行内存诊断,节省了在外部工具和IDE之间切换的时间,提高了工作效率。对于大型或复杂项目...
6. 堆:如 poj2299。 7. trie 树:用于字符串搜索,如 poj2513。 四、简单搜索: 1. 深度优先搜索:如 poj2488。 2. 广度优先搜索:如 poj3278。 3. 搜索技巧与剪枝:提高搜索效率,如 poj2531。 五、动态规划: 1...