算法导论/6.2保持堆性质
2015-09-10 21:42
441 查看
保持堆性质的递归与迭代源程序
源代码
/* * 算法导论/6.2保持堆性质的实现 * 2015.9.10 by Bean * */ #include <stdio.h> /** * LEFT - 求左子节点的序号 * @parent 父节点的序号 */ int LEFT(int parent); /** * RIGHT - 求左子节点的序号 * @parent 父节点的序号 */ int RIGHT(int parent); /** * heap_size - 求堆的大小,为数组的第一个数 * @a 数组的指针 */ int heap_size(int a[]); /** * exchange - 原地交换数值 * @a && @b 数值 */ int exchange(int* a, int* b); /** * print - 打印数组 * @a 数组指针 */ int print(int a[]); extern int printf(char*...); int MAX_HEAPIFY(int a[], int i, int* = 0); //递归 void MAX_HEAPIFY(int a[], int i, char* = 0);//迭代 //具体算法描述参看算法导论p131 int MAX_HEAPIFY(int a[], int i, int* )//数组从1开始 { int l = LEFT(i); int r = RIGHT(i); int heapSize = heap_size(a); int largest = -1; if (l <= heapSize && a[l] > a[i]) largest = l; else largest = i; if (r <= heapSize && a[r] > a[largest]) largest = r; if (largest != i) exchange(&a[i], &a[largest]) && MAX_HEAPIFY(a, largest, (int*)0); return true; } #define PARENT(i) ((i - 1) / 2) #define LEFT(i) (i << 1) #define RIGHT(i) ((i << 1) + 1) void MAX_HEAPIFY(int a[], int i, char*) { int l = LEFT(i); int r = RIGHT(i); int heapSize = heap_size(a); int largest = -1; int flag = true; //防止死循环, while (flag && (l <= heapSize || r <= heapSize)) { if (l <= heapSize && a[l] > a[i]) largest = l; else largest = i; if (r <= heapSize && a[r] > a[largest]) largest = r; if (largest != i) exchange(&a[i], &a[largest]); else flag = false; } } #undef PARENT #undef LEFT #undef RIGHT int LEFT(int i) { return i << 1; } int RIGHT(int i) { return (i << 1) + 1; } int heap_size(int a[]) { return a[0]; } int exchange(int* a, int* b) { if ( *a != *b) { // int t = *a + *b; // *a = t - *a; // *b = t - *b; *a ^= *b ^= *a ^= *b; } return true; } //驱动程序 int main() { int a[] = {10, 16, 4, 10, 14, 7, 9, 3, 2, 8, 1}; //MAX_HEAPIFY(a, 2, (int*)0); MAX_HEAPIFY(a, 2, (char*)0); for (int i = 0; i <= heap_size(a); i++) printf("%d ", a[i]); return 0; }
相关文章推荐
- Android应用资源系列之属性(Attribute)资源
- BZOJ 3238: [Ahoi2013]差异( 后缀数组 + 单调栈 )
- poj_1182 并查集
- Android:Intent
- 【数据结构系列】堆与堆排序
- 浅谈Sonar
- 黑马程序员——Objective--C笔记之封装 继承 多态
- OC09_内存高级&集合
- 常用工具备份
- 可重入函数与线程安全函数
- Rust - Reference counted and raw pointers | 引用计数和原始指针
- 【杭电】1013【 Digital Roots】 犯下的错误
- Redis学习3之单节点上redis集群搭建和使用
- UITextField
- lcx.exe 转发
- ORM进阶:映射文件编写(上)-基本映射
- 0909关于编译的看法
- Rust - Borrowed pointers | 借贷指针
- Shell脚本-良好的习惯
- 第97讲:使用SBT开发Akka第一个案例环境搭建详解学习笔记