小根堆

小根堆的构建可以通过插入构建或调整建堆来完成

头文件,堆结构

#include<iostream>
using namespace std;

typedef int ELemtType;
#define MINVALUE -10000;

typedef struct Heap{
	ELemtType *arry;
	int size;
	int capacity;
}*minHeap;

minHeap createHeap();
bool isFull(minHeap h);
void insert(minHeap &H,ELemtType k);
bool isEmpty(minHeap h);
void sort(minHeap &H);
void adjust(minHeap &H)

方法的定义

#include "stdafx.h"
#include"heap.h"
#include<iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}

minHeap createHeap(int maxSize) {
	minHeap heap = new Heap;
	heap->arry = new ELemtType[maxSize+1];
	heap->size = 0;
	heap->arry[0] = MINVALUE;
	heap->capacity = maxSize;
	memset(heap->arry,INT_MAX,maxSize);
	return heap;
}
bool isEmpty(minHeap H) {
	return H->size == 0;
}
bool isFull(minHeap H) {
	return H->capacity == H->size;
}

void insert(minHeap &H,ELemtType key) {
	if(isFull(H)){
		cout << "堆满,无法插入!"<<endl;
		return;
	}
	int i = ++H->size;
	for(;H->arry[i/2] > key;i/=2){
		H->arry[i] = H->arry[i/2];
	}
	H->arry[i] = key;
}

void sort(minHeap &H,int i){
	if(isEmpty(H)) {
		cout << "堆空!" << endl;
		return;
	}
	int child,parent;
	int tmp = H->arry[i];
	for(parent = i;parent * 2 <=H->size;parent = child){
		child = parent * 2;
		if(child + 1 <= H->size && H->arry[child] > H->arry[child+1]){
			child = child + 1;
		}
		if(tmp < H->arry[child]) break;
		else
			H->arry[parent] = H->arry[child];
	}
	H->arry[parent] = tmp;
}

void adjust(minHeap &H) {
	int i = H->size / 2;
	for(;i>0;i--) {
		//以每个有孩子结点的结点作为根节点,对其子树进行堆排序
		sort(H,i);
	}
}

//遍历
void levelTravers(minHeap H) {
	for(int i = 1;i <= H->size;i++){
		cout << H->arry[i] << " ";
	}
	cout << endl;
}


int main () {
	int n;
	cin >> n;
	minHeap H = createHeap(n);
	minHeap H2 = createHeap(n);
	int k;
	for(int i = 0;i < n;i++) {
		cin >> H->arry[++H->size];
	}
	for(int i = 1;i<=n;i++){
		insert(H2,H->arry[i]);
	}
	adjust(H);
	levelTravers(H);
	cout <<  endl;
	levelTravers(H2);
	cin >> n;
	delete(H);
	delete(H2);

}



好的,我来为您讲解一下结构体小根堆的实现。 首先,我们需要定义一个结构体来表示堆中的元素。假设我们需要维护一个包含学生姓名和分数的小根堆,那么结构体可以定义如下: ```c++ struct Student { std::string name; int score; // 重载小于运算符,用于比较结构体对象大小 bool operator<(const Student& other) const { return score > other.score; // 注意这里是小于号,因为要实现小根堆 } }; ``` 接下来,我们可以使用 STL 中的 priority_queue 来实现小根堆。 ```c++ #include <queue> using namespace std; priority_queue<Student> q; // 创建一个空的小根堆 // 往小根堆中插入一个元素 Student s1 = {"Tom", 80}; q.push(s1); // 从小根堆中取出堆顶元素(即分数最低的学生) Student top_student = q.top(); q.pop(); ``` 在上面的代码中,我们使用 priority_queue 来创建一个空的小根堆,并使用结构体 Student 来表示堆中的元素。往堆中插入一个元素时,只需要调用 push 函数即可。从堆中取出堆顶元素时,只需要调用 top 函数获取堆顶元素,再调用 pop 函数将其从堆中删除即可。 需要注意的是,我们需要在结构体中重载小于运算符,以便 priority_queue 可以正确比较结构体对象的大小。在上面的代码中,重载的小于运算符返回的是分数较低的学生应该排在前面。 希望这个简单的例子可以帮助您理解结构体小根堆的实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值