栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【算法小结】堆及堆排序

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【算法小结】堆及堆排序

“ Ctrl AC!一起 AC!”

目录

堆排序


堆是一颗完全二叉树,其中树的每个结点都不小于其左右孩子的称为最大堆,反之称为最小堆

【以下以最大堆为例】

定义数组表示堆:

const int maxn=100;
//heap为堆,n为元素个数
int heap[maxn],n=10;

向下调整:

//low为欲调整的下标,high为最后一个元素的下标
void downAdjust(int low,int high){
	int i=low,j=i*2;
	while(j<=high){
		if(j+1<=high&&heap[j+1]>heap[j]){
			j=j+1;
		}
		if(heap[j]>heap[i]){
			swap(heap[j],heap[i]);
			i=j; //i继续跟着原来的low点,j继续充当左孩子
			j=i*2;
		}
		else{
			break;
		}
	}
}

建堆:

从n/2枚举到1,保证枚举的不是叶结点,并且最大的数能到达最顶端。

void creatHeap(){
	for(int i=n/2;i>=1;i--){
		downAdjust(i,n);
	}
}

删除堆顶元素:

将数组的最后一个数代替掉堆顶的元素,然后总个数减一,并向下调整堆顶元素至合适位置。

void deleteTop(){
	heap[1]=heap[n--];
	downAdjust(1,n);
}

向上调整:

//其中low一般为1,表示第一个元素,high表示欲调整的元素
void upAdjust(int low,int high){
	int i=high,j=i/2;
	while(j>=low){
		if(heap[j] 

插入元素:

在数组末尾加新元素,然后通过向上调整,将其调至合适位置。

void insert(int x){
	heap[++n]=x;
	upAdjust(1,n);
}

堆排序

取堆顶元素并删除调整,按顺序放入容器就变成有序的了。

具体讲就是,取出堆顶元素,用堆的最后一个元素替换掉它,然后对堆顶向下调整至合适位置,保持堆的性质。

void heapSort(){
	createHeap();
	for(int i=n;i>1;i--){
		printf("%dn",heap[1]);
		swap(heap[i],heap[1]);
		downAdjust(1,i-1);
	}
	printf("%dn",heap[1]);//输出最后一个
}

感谢阅读!!!

“ Ctrl AC!一起 AC!”

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/739018.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号