堆排序(完全二叉树用,利用完全二叉树的性质用数组存储)

本文详细介绍了如何使用C++实现大顶堆的构建过程,并通过heapify和buildHeap函数确保完全二叉树满足堆的性质。进一步,通过heapSort函数实现了基于大顶堆的排序算法,该算法首先构建大顶堆,然后反复将堆顶元素与末尾元素交换并调整堆,直至完成排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

构建大顶堆:

 

#include<bits/stdc++.h> 
//堆是完全二叉树 
void swap(int tree[],int i,int max) //存在更大的结点值 (使此时最大结点的值与当前最大结点的值交换
{
	int temp;
	temp=tree[i];
	tree[i]=tree[max];
	tree[max]=temp;		
}
void heapify(int tree[],int n,int i){  //构建堆 buildHeap和heapify分开写更加灵活 
	if(i>=n){
		return;
	}
	int c1=2*i+1;
	int c2=2*i+2;
	int max=i;
	if(c1<n&&tree[max]<tree[c1]){
		max=c1; //这里的max为最大值的下标(索引位置)
	}
	if(c2<n&&tree[max]<tree[c2]){
		max=c2; //这里的max为最大值的下标
	}
	if(max!=i){     
		swap(tree,i,max); //交换结点tree[i], tree[max]
		heapify(tree,n,max);//交换了结点后, 左右子树被交换结点的子树需要重新构建堆
	}
	
}
void buildHeap(int tree[],int n){ // 	从最后一个元素构建堆 传入的n是tree数组中的最后一个元素为了保证
	int lastnode=n-1;				 //保证每个子结点的树都是堆 
	int parentId=(lastnode-1)/2;         //从最后一个不是叶节点的点开始往前做heapify操作的 
	for(int i=parentId;i>=0;i--){
		heapify(tree,n,i);
	}
}

void heapSort(int tree[],int n){//完成堆排序 
	buildHeap(tree,n);//此时使树中子结点都满足堆排序 
	for(int i=n-1;i>=0;i--){
		swap(tree,0,i);   
		heapify(tree,i,0);//重新构成堆,因为除了首节点外,其余的点
						  //都已经是堆结构了,所以不用buildHeap倒叙重新构建堆了 
	}
}
int main(){
	int tree[]={4,10,3,5,1,2};
	int n=6;
//	buildHeap(tree,6);
	heapSort(tree,n);
	for(int i=0;i<n;i++)   //此时是树中子结点都满足子堆 						   //但是不规则的堆就不能用 
		printf("%d\n",tree[i]);	
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值