算法导论/6.2保持堆性质
来源:互联网 发布:江西广电网络缴费 编辑:程序博客网 时间:2024/06/05 17:01
保持堆性质的递归与迭代源程序
源代码
/** 算法导论/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);//迭代//具体算法描述参看算法导论p131int 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 RIGHTint 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;}
0 0
- 算法导论/6.2保持堆性质
- 《算法导论》笔记 第6章 6.2保持堆的性质
- 6.2 保持堆的性质
- 算法导论第六章6.2维护堆的性质课后答案
- 算法导论程序9--维护堆的性质
- 习题 6.2-5 保持堆的性质 (迭代)
- 第六章堆排序之“保持堆的性质MAX-HEAPIFY”(迭代版,练习6.2-5)
- 算法导论 堆排序
- 算法导论--堆排序
- 【算法导论】 堆排序
- 算法导论-----堆排序
- 【算法导论】堆排序
- 算法导论-堆排序
- 堆排序--算法导论
- 算法导论:堆排序
- [算法导论]最大堆
- 算法导论:堆排序
- 算法导论堆实现
- 关于静态cell的使用
- 93 汉诺塔(三)【模拟】
- Android应用资源系列之属性(Attribute)资源
- Ubuntu14.04下,Tomcat8+Nginx+memcache配置服务器集群session共享
- Android studio 目录结构
- 算法导论/6.2保持堆性质
- Java注释讲解
- Rust - Data types | 数据类型
- 黑马程序员_java09_集合框架
- Hausdorff距离匹配算法及代码
- [letcode]Perfect Squares
- 阅读本书所需的基础知识 -- 再次强调。
- Rust - Destructuring 解构
- C++Primer第五版 2.1.1节练习