学习笔记(01):算法&数据结构-topk问题

立即学习:https://edu.csdn.net/course/play/24449/308966?utm_source=blogtoedu

 #include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
int a[110];
using namespace std;
void kkk(int a[],int low,int high)
{
	//low:堆的根结点位置
	//high:堆的最后一个元素的位置 
	int x=low;//x开始指向根节点 
	int y=2*x+1;//y开始是左孩子 
	int tmp=a[low];//把堆顶存起来 
	while(y<=high)//只要y位置有值
	{
		if(a[y+1]>a[y]&&y+1<=high)//如果右孩子比左边大且有值 
		{
			y=y+1;//y指向右孩子 
		}
		if(a[y]>tmp) 
		{
			a[x]=a[y];	  
			x=y;//往下看一层 
			y=2*x+1;
		}
		else//tmp更大,把tmp放到x的位置 
		{
			a[x]=tmp; 
			break;
		}
	} 
	a[x]=tmp; //把tmp放到叶子节点上 
}
void dui_pai_xu(int a[])
{
	int n=3;
	for(int i=(n-1)/2;i>=0;i--)//i表示建堆的时候调整的部分的下标 
	{
		kkk(a,i,n-1);
	}
	for(int i=n-1;i>0;i--)//i指向当前堆最后一个元素 
	{
		swap(a[0],a[i]);
		kkk(a,0,i-1);
	}
} 
int main()
{
	for(int i=0;i<3;i++) cin>>a[i];
	dui_pai_xu(a);
	for(int i=0;i<3;i++) cout<<a[i]<<" ";
 	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值