堆排序

本文详细介绍了堆排序算法的实现原理及步骤,包括如何构建大根堆或小根堆,并通过具体的C++代码示例展示了堆排序的过程。文章还解释了堆的概念、堆排序的基本思想以及如何初始化堆。

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

堆的定义:

设一个非叶子节点的下标为n;

孩子节点下标分别为2n+1,2n+2;

a[n]>a[2n+1]&&a[n]>a[2n+2],是大根堆;

a[n]<a[2n+1]&&a[n]<a[2n+2]是小根堆。

堆排序的思路:最后一个非叶子节点的下标为(size/2)-1;从最后一个非叶子节点开始往前调整数组,使之成为堆<1>,所以需要一个函数来初始化堆;在往前调整的过程中要注意,节点与其l或r节点互换的过程中,以l或r的节点作为n的节点也要满足堆的性质,所以需要一个函数从上至下来调整堆。初始化完成后,交换堆顶元素与当前的末尾元素,使当前的最值调整到最后边。

附上代码:

# include<iostream>
using namespace std;

int MAX(int a ,int b)
{
	return a>b?a:b;

}
void swap(int &a,int &b)
{
	int temp;
	temp=a;
	a=b;
	b=temp;
}
void Heapfromtop(int a[],int j,int size)
{
	int jl,jr,max;
		
	
	while(j<=(size)/2-1)
		{
			jl=2*j+1;
			jr=2*j+2;
				if(jr>size-1)
				{
			
					if(MAX(a[jl],a[j])!=a[j])
					{
						swap(a[jl],a[j]);
						break;
					}
					else
					{
						break;
					}
		
				}
				else
				{
					if((max=MAX(MAX(a[j],a[jl]),a[jr]))!=a[j])
					{
						if(max==a[jr])
						{
									
							swap(a[j],a[jr]);
							j=jr;
						}
						else
						{
							swap(a[j],a[jl]);
							j=jl;
						}
					}
					else
					{
						break;
					}
							
				}			
		}
}
void  Init_heap(int a[],int size)
{
	int max;
	
	for(int i=size/2-1;i>=0;i--)
	{
		int l=i*2+1;
		int r=i*2+2;
		if(r>size-1)
		{
			
			if(MAX(a[l],a[i])!=a[i])
			{
				swap(a[l],a[i]);
						
			}
		
		}
		else
		{
			if((max=MAX(MAX(a[i],a[l]),a[r]))!=a[i])
			{
				if(max==a[l])
				{
				
					swap(a[i],a[l]);
					Heapfromtop(a,l,size);
					

				}
				else
				{
					swap(a[i],a[r]);
					Heapfromtop(a,r,size);
					
				
				}
			
			}
		
		}

	}
}


void main()
{
	int a[10]={1,9,2,8,3,4,7,5,0,6};
	Init_heap(a,10);
	
	for(int i=10-1;i>=0;i--)
	{
		swap(a[0],a[i]);
		Heapfromtop(a,0,i);
	}
		

	cout<<"heap sort done:\n";
	for(int j=0;j<10;j++)
	{
		cout<<a[j]<<" ";
	}
	
	return;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值