最大堆及優先隊列的實現

最大堆的原理與實現比較簡單,只需要用數組即可實現,下面給出我的實現版本

對於向上調整函數,向下調整函數的實現,我運用遞歸的方法。

/*
最大堆的實現(以int型爲例)
成員函數:
一、向下調整函數
void MaxHeapSiftDown(MAX_HEAP &h, int i)
功能:將堆h中第i個元素向下調整

二、向上調整函數
void MaxHeapSiftUp(MAX_HEAP &h, int i)
功能:將堆h中第i個元素向上調整

三、彈出堆頂元素函數
void MaxHeapPop(MAX_HEAP &h)
功能:將堆h中最大元素刪除

四、返回堆頂元素函數
int MaxHeapTop(MAX_HEAP h)
功能:返回堆h中的最大元素

五、插入函數
void MaxHeapPush(MAX_HEAP &h, int value)
功能:將值爲value的元素插入堆h中
*/

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

const int maxn = 10000;
const int inf = 100000;
struct MAX_HEAP {
	int heap[maxn];
	int size;
}h;

void MaxHeapSiftDown(MAX_HEAP &h, int i)
{
	int pos = i;
	int L = 2 * i;
	int R = 2 * i + 1;

	if (L <= h.size && h.heap[L] > h.heap[pos])
		pos = L;
	if (R <= h.size && h.heap[R] > h.heap[pos])
		pos = R;
	if (pos != i) {
		swap(h.heap[pos], h.heap[i]);
		MaxHeapSiftDown(h, pos);
	}
}

void MaxHeapSiftUp(MAX_HEAP &h, int i)
{
	if (i > 1 && h.heap[i] > h.heap[i/2]) {
		swap(h.heap[i], h.heap[i/2]);
		MaxHeapSiftUp(h, i / 2);
	}
}

void MaxHeapPush(MAX_HEAP &h, int value)
{
    h.size++;
    h.heap[h.size] = value;
    MaxHeapSiftUp(h, h.size);
}

int MaxHeapTop(MAX_HEAP h)
{
    if (h.size >= 1)
        return h.heap[1];
    else {
        fprintf(stderr, "none element\n");
        return -inf;
    }
}

void MaxHeapPop(MAX_HEAP &h)
{
    if (h.size >= 1) {
        h.heap[1] = h.heap[h.size];
        h.size--;
        MaxHeapSiftDown(h, 1);
    } else
        fprintf(stderr, "the heap is empty");
    return;
}

int main()
{
    h.size = 0;
    MaxHeapPush(h, 1);
    MaxHeapPush(h, 8);
    MaxHeapPush(h, 3);
    MaxHeapPush(h, 5);


    cout << MaxHeapTop(h) << endl ;
    MaxHeapPop(h);

    cout << MaxHeapTop(h) << endl;
    MaxHeapPop(h);

    MaxHeapPush(h, 11);

    cout << MaxHeapTop(h) << endl;
    MaxHeapPop(h);

    cout << MaxHeapTop(h) << endl;
    MaxHeapPop(h);


	return 0;
}




發佈了58 篇原創文章 · 獲贊 31 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章