说明:clion在实现插入的时候会出现BAD_PROGRESS的错误,而在DEV中就可以运行。另外,代码中有几个很细节的问题,在实现的过程中也用了较长时间去debug,如果大家在自己实现大根堆的时候遇到了一些问题,我想对比一下还是有些意义的。
#include <iostream>
using namespace std;
#define Maxsize 200
typedef struct {
int key;
} Elementtype;
typedef struct {
Elementtype elements[Maxsize];
int n; //堆元素计数
} HEAP;
void MaxHeap(HEAP heap) { //初始化
heap.n = 0 ; //置空
}
bool HeapEmpty(HEAP heap) {
return (!heap.n);
}
bool HeapFull(HEAP heap) {
return (heap.n == Maxsize - 1);
}
void Insert(HEAP &heap, Elementtype item) {
int i=1;
if (!HeapFull(heap)) {
i = heap.n + 1;
while ((i != 1) && (item.key > heap.elements[i / 2].key)) {
heap.elements[i] = heap.elements[i / 2];
i /= 2;
}
heap.n++; //这里的heap.n在main里加一也可以
}
heap.elements[i] = item;
}
Elementtype DeleteMax(HEAP &heap) {
int parent = 1, child = 2;
Elementtype item, tmp;
item = heap.elements[1];
if (!HeapEmpty(heap)) {
tmp = heap.elements[heap.n--];
while (child <= heap.n) {
if ((child < heap.n) && (heap.elements[child].key < heap.elements[child + 1].key))
child++;
if (tmp.key >= heap.elements[child].key)
break;
heap.elements[parent] = heap.elements[child];
parent = child;
child *= 2;
}
heap.elements[parent] = tmp;
return item;
} else {
MaxHeap(heap);
return item;
}
}
int Find(HEAP heap,int x)
{
int i=1;
while((i<heap.n)&& (heap.elements[i].key!=x ))
{
if(heap.elements[i].key<x)
if(heap.elements[i+1].key>=x) i++;
else return 0;
else
i++;
}
if(i<=heap.n) return i;
else return 0;
}
int main() {
HEAP heap;
MaxHeap(heap);
heap.n=0; //很关键的一个步,不然heap.n的置并不是0,而是一个地址
Elementtype a[11] = {100, 90, 80, 70, 50, 60, 45, 30, 25, 20, 40};
for (int i = 0; i < 11; i++) {
Insert(heap, a[i]);
}
cout << "堆的序列: " << endl;
for ( int i = 1; i <= heap.n; i++) {
cout<< heap.elements[i].key<<" ";
}
cout << endl;
DeleteMax(heap); //只是删除根结点
cout << "删除后序列: " << endl;
for ( int i = 1; i <= heap.n; i++) {
cout<< heap.elements[i].key<<" ";
}
cout << endl;
cout<<"输入要查找的元素"<<endl;
int x;
cin>>x;
cout<<Find(heap,x)<<endl;
return 0;
}
主要参考: 《数据结构与算法》(第五版)张岩
《数据结构考研复习指导》(王道)