数据结构堆排序

#include <bits/stdc++.h>
using namespace std;

//大顶堆 ,逻辑结构为完全二叉树,存储结构为一维数组 

/*
小顶堆的插入:
	每次插入都是将新数据放在数组最后。 
	//  新加入i结点  其父结点为i/2 
	void MinHeapFixup(int a[], int i)  
	{  
	    int j, temp;  
	      
	    temp = a[i];  
	    j = i/2;      //父结点  
	    while (j >= 1 && i != 1)  
	    {  
	        if (a[j] <= temp)  
	            break;  
	          
	        a[i] = a[j];     //把较大的子结点往下移动,替换它的子结点  
	        i = j;  
	        j = i/2;  
	    }  
	    a[i] = temp;  
	}  
*/ 
int n;
int length;
int a[1005];

void HeapAdjust(int a[],int s,int m)	//筛选,s是要筛选结点的下标,m是最后一个结点下标 
{//s,j分别是父结点和左孩子结点的下标 
	int temp=a[s];	 	//暂存到temp变量中 
	for(int j=2*s;j<=m;j*=2)	//j是i结点的左孩子下标 
	{
		if(j<m&&(a[j]<a[j+1]))	//j要小于m,不然j+1就越界了 
			++j;				//筛选左右孩子最大的结点的下标 
		if(!(temp<a[j]))	//如果temp>=左右孩子,就跳出循环,不用交换 
			break;
		a[s]=a[j];	//执行到这里,说明要交换 
		s=j;	 
	}	
	a[s]=temp;
}

void HeapSort(int a[])
{
	for(int i=length/2;i>=1;i--)	//对非终端节点依次筛选,从length/2开始(即最后一个非终端结点) 
	{
		HeapAdjust(a,i,length);
	}
	for(int i=length;i>1;--i)	//将堆顶与最后一个元素交换,再对[1,i-1]重新调整为大顶堆 
	{
		swap(a[1],a[i]);
		HeapAdjust(a,1,i-1);
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	length=n;
	HeapSort(a);
	for(int i=1;i<=n;i++)
		cout<<a[i]<<" "; 
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值