首页 > 代码库 > 编程算法 - 堆(heap) 代码(C)

编程算法 - 堆(heap) 代码(C)

堆(heap) 代码(C)


本文地址: http://blog.csdn.net/caroline_wendy


堆(heap)作为二叉树的重要应用, 时间复杂度O(logn), 需要熟练的写出其代码, 基本代码如下, 需要背写.


代码:

/*
 * main.cpp
 *
 *  Created on: 2014.7.20
 *      Author: spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <stdio.h>

class Heap {
	static const int MAX_N = 1000;
	int heap[MAX_N], sz=0;
public:
	void push(int x) {
		int i=sz++;
		while (i>0) {
			int p = (i-1)/2;
			if (heap[p]<=x) break;
			heap[i] = heap[p];
			i = p;
		}
		heap[i]=x;
	}
	int pop() {
		int ret = heap[0];
		int x = heap[--sz];
		int i=0;
		while (i*2+1<sz) {
			int a=i*2+1, b=i*2+2;
			if (b<sz && heap[b]<heap[a]) a=b; //a始终代表最小值
			if (heap[a]>=x) break;
			heap[i] = heap[a];
			i = a;
		}
		heap[i] = x;
		return ret;
	}
};



int main(void)
{
	Heap h;
	h.push(3);
	h.push(5);
	h.push(4);
	h.push(1);
	for (int i=0; i<4; ++i) {
		printf("%d ", h.pop());
	}
	printf("\n");

	return 0;
}



输出:

1 3 4 5 


也可以使用库函数(#include<queue>)优先级队列(priority_queue), 但是取值默认得到最大值

可以使用priority_queue<int, vector<int>, greater<int> > 输出最小值.

代码:

/*
 * main.cpp
 *
 *  Created on: 2014.7.20
 *      Author: spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <stdio.h>

#include <queue>
#include <vector>
#include <functional>

using namespace std;

int main(void)
{
	priority_queue<int, std::vector<int>, std::greater<int> > pque;

	pque.push(3);
	pque.push(5);
	pque.push(1);
	pque.push(4);

	while (!pque.empty()) {
		printf("%d ", pque.top());
		pque.pop();
	}
	printf("\n");

	return 0;

	
}



输出:

1 3 4 5 






编程算法 - 堆(heap) 代码(C)