基于优先队列的应用--堆排序和霍夫曼树

本文介绍了优先队列在堆排序和霍夫曼树中的应用。堆排序通过大根堆实现,不断将最大元素移到数组末尾。霍夫曼树是一种加权路径长度最小的二叉树,利用小根堆合并权值最小的树,直至剩下一棵树。文章详细讲解了霍夫曼树的节点构造和构建过程。
摘要由CSDN通过智能技术生成
堆排序

堆排序就是将数组堆化,大根堆小根堆的根元素永远是最大或者最小的,于是我们取根元素然后调整堆,继续一下次的堆化,不断重复直到取完(或者只剩下根元素)。
此处采用大根堆,将根元素也就是数组的[0]元素不断放到数组的末尾。大根堆的实现可见大小根堆的实现

#pragma once
//=============================基于根堆的应用--堆排序==========================
//其实就是初始化大根堆的过程 初始化后不断从堆中取出top()元素后pop() 直至堆空
//需要注意的是 与前面的maxHeap.h不同 在maxHeap.h中 我们构造了一个大小为:目标数组大小+1的堆数组heap
//且heap[0]不用 所以我们的下标包括树的根都是从1开始计数的 所以它的左右孩子分别为2*root和2*root+1
//此处我们为了堆排序的效率和性能 不重新分配一个堆数组了 直接在原数组中进行排序
//那么我们的下标包括根的下标就必须从0开始 且根的左右孩子分别为2*root+1和2*root+2
//同时对于根节点来说 heap.h中它的根节点就是child/2 但是此处它的根节点为(child-1)/2
template <typename T>
void heapSort(T arr[], size_t arrSize) {
   
	--arrSize;//指向尾元素
	//首先初始化为堆
	for (int root = arrSize / 2; root >= 0; --root) {
   
		int child = 2 * root + 1;//根的左孩子
		T rootElement = arr[root];
		while (child <= arrSize) {
   
			if (child < arrSize && arr[child] < arr[child + 1])//选左右孩子中大的一个
				++child;
			if (rootElement > arr[child])//是否可以在该位置插入?
				break;
			//不可以。随后把左右孩子中大的一个存在arr[child/2]上,child移动到下一层的左孩子。
			arr[
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值