c++手写堆

Posted yeah17981

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++手写堆相关的知识,希望对你有一定的参考价值。

无聊尝试一下

#include<bits/stdc++.h>
using namespace std;
void adjustheap(vector<int> &b,int index,int len) //堆的向下调整

	//int len = b.size() - 1;//长度 
    int cur = index;//要交换的元素的当前位置 
    int left_child = 2 *cur + 1; //左儿子 
    while(left_child <= len)
    
   		if( left_child < len && b[left_child] < b[left_child + 1])
    	
        	left_child++;
    	
        if(b[cur] < b[left_child])
            swap(b[cur], b[left_child]);       
            cur = left_child;
            left_child = 2 * cur + 1;
        
        else break;
    

void upAdjust(vector<int> &b,int index)

	//左子节点=2*父节点+1 右子节点=2*父节点+2 
	int cur=index;
	int father=cur/2;
	if(cur%2==0) father--;
	while (cur>= 1)
	
		// 如果父节点的权值比子节点权值小,则交换元素
		if (b[father]<b[cur])
		
			swap(b[father],b[cur]);
			cur = father;
			father=cur/2;
			if(cur%2==0) father--;
		
		else
		
			break;
		
	

void makeheap(vector<int> &b,int len)

	
	int index = (len - 2)/2 + 1;//从最后一个非叶子节点开始建堆。
    for(int i = index ; i >= 0;i--)
    adjustheap(b,i,len);
    return ;

vector<int> b;
int main()

	int n,a;
	cin>>n;
	while(n--)
	
		cin>>a;
		b.push_back(a);
	
	int len = b.size() - 1;//长度 
	makeheap(b,len);
	int k=5; 
	for(int i=1;i<=k;i++)//取前k个数 
	
		cout<<b[0]<<" ";
		swap(b[0],b[len]);
		len--;
		b.pop_back();
		adjustheap(b,0,len);
	 
	cin>>n;
	while(n--)//插入 
	
		cin>>a;
		b.push_back(a);
		len++;
		upAdjust(b,len);
	
	 k=len; 
	for(int i=1;i<=k;i++)//取所有数 
	
		cout<<b[0]<<" ";
		swap(b[0],b[len]);
		len--;
		adjustheap(b,0,len);
	 
 

以上是关于c++手写堆的主要内容,如果未能解决你的问题,请参考以下文章

堆——练习题

数据结构:堆手写

快速排序(QuickSort),归并排序(MergeSort),堆排序(HeapSort)典型C++代码实现总结

一篇无聊的随笔

手写堆

Luogu [P1334] 瑞瑞的木板(手写堆)