heap
2015-11-25 16:51
405 查看
1002. heap
实现一个小根堆用以做优先队列。
给定如下数据类型的定义:
class array {
private:
int elem[MAXN];
public:
int &operator[](int i) { return elem[i]; }
};
class heap {
private:
int n;
array h;
public:
void clear() { n = 0; }
int top() { return h[1]; }
int size() { return n; }
void push(int);
void pop();
};
要求实现:
void heap::push(int x) {
// your code
}
void heap::pop() {
// your code
}
实现一个小根堆用以做优先队列。
给定如下数据类型的定义:
class array {
private:
int elem[MAXN];
public:
int &operator[](int i) { return elem[i]; }
};
class heap {
private:
int n;
array h;
public:
void clear() { n = 0; }
int top() { return h[1]; }
int size() { return n; }
void push(int);
void pop();
};
要求实现:
void heap::push(int x) {
// your code
}
void heap::pop() {
// your code
}
// Problem#: 16344 // Submission#: 4171675 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/ // All Copyright reserved by Informatic Lab of Sun Yat-sen University void heap::push(int input ) { h[++n] = input ; int pos = n / 2 , last = n ; while(pos >= 1 ){ if(h[pos] <= h[last]){ break ; } swap(h[pos] , h[last]); last = pos ; pos = pos / 2; } } void heap::pop() { h[1] = h[n--] ; int pos = 1 ; while(1){ if(2 * pos > n) break ; if(2 * pos == n && h >= h[pos]) break ; if(2 * pos < n && h[pos] <= h[pos * 2 ] && h[pos] <= h[pos * 2 + 1]) break; if(2 * pos == n && h < h[pos]){ swap(h , h[pos]) ; break ; } else{ if(h[pos * 2] < h[pos * 2 + 1]){ swap(h[pos] , h[pos * 2]) ; pos = pos * 2 ; } else { swap(h[pos] , h[pos * 2 + 1]) ; pos = pos * 2 + 1 ; } } } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性
- C++ Custom Control控件向父窗体发送对应的消息