编程算法 - 堆(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

时间: 2024-10-01 00:29:00

编程算法 - 堆(heap) 代码(C)的相关文章

编程算法 - 篱笆修理(Fence Repair) 堆(heap) 代码(C++)

篱笆修理(Fence Repair) 堆(heap) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目参考: http://blog.csdn.net/caroline_wendy/article/details/37911157 本题比较简单, 直接使用堆(heap)选取两个最小的值, 合并再放入堆, 最后求出和. 比起贪婪算法O(n^2), 时间复杂度O(nlogn). 代码: /* * main.cpp * * Created on:

编程算法 - 丑数 代码(C)

丑数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 我们把只包含因子2, 3 和 5的数称作丑数. 求按从小到大的顺序的第5个丑数. 可以设置一个数组包含所需要的丑数, 依次比较乘以2, 乘以3, 乘以5的最小的数, 最后返回结果. 如第5个丑数是5, 如1, 2, 3, 4(2*2), 5均是丑数. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*ecli

编程算法 - 硬币问题 代码(C)

硬币问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有1, 5, 10, 50, 100, 500元硬币各若干枚, 现在要用这些硬币来支付A元, 最少需要多少枚硬币? 假定本题至少存在一种支付方案. 使用贪心算法, 优先选用最大的硬币, 并不断的调整硬币的数量. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike */ /*eclipse cdt, gcc 4.8.1

编程算法 - 区间调度问题 代码(C)

区间调度问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n项工作, 每项工作分别在s时间开始, 在t时间结束. 对于每项工作可以选择参与与否, 如果参与, 则全程参与. 参与时间段不能重叠, 包括起始结束瞬间也不能重叠. 求最多能参与多少项工作? 使用贪心法, 策略是在可选工作中, 每次都选取结束时间最早的工作. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike

编程算法 - 二分图判定 代码(C)

二分图判定 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定一个具有n个顶点的图. 要给图上每个顶点染色, 并且要使相邻的顶点颜色不同.  是否能最多用2种颜色进行染色. 没有重边和闭环. 即二分图问题. 使用深度优先搜索(dfs), 把顶点染成c, 然后相邻边染成-c. 如果相邻边被染色过, 且相同, 则图不是二分图; 如果所有边都被染色, 并且互不相同, 则是二分图. 进行多次搜索, 避免非连通图. 代码: /* * CppPrim

编程算法 - 部分和问题 代码(C)

部分和问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定整数a1, a2, ..., an, 判断是否可以从中选出若干数, 使它们的和恰好为k. 解法很多, 最简单的解法是使用深度优先搜索, 时间复杂度O(2^n), 不是最优解法. 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <s

编程算法 - 背包问题(递归) 代码(C)

背包问题(递归) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n个重量和价值分别为w,v的物品, 从这些物品中挑选出总重量不超过W的物品, 求所有挑选方案中价值总和的最大值. 即经典动态规划问题. 可以使用深度优先搜索, 把每个部分都遍历到, 选取最优解, 但不是最好的方法. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike */ /*eclipse cdt, gc

编程算法 - 字符串相同 代码(Java)

字符串相同 代码(Java) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 实现一个算法, 确定一个字符串的所有字符是否全都不同. 假使不允许使用额外的数据结构, 又该如何处理. 解法1: 使用数据结构, 设置boolean数组, 把值(value)作为数组的索引(index), 判断数组是否重复. 解法2: 不使用数据结构, 可以通过位(bit)进行判断, 把每个字母映射2进制数的一位, 或运算("|")更新数字的位, 与运算("

编程算法 - 数丑陋 代码(C)

数丑陋 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 我们把仅仅包括因子2, 3 和 5的数称作丑数. 求按从小到大的顺序的第5个丑数. 能够设置一个数组包括所须要的丑数, 依次比較乘以2, 乘以3, 乘以5的最小的数, 最后返回结果. 如第5个丑数是5, 如1, 2, 3, 4(2*2), 5均是丑数. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*ec