大根堆和小根堆的C语言实现
来源:互联网 发布:手机淘宝试用中心在哪 编辑:程序博客网 时间:2024/06/07 08:28
大根堆小根堆的实现:以PPT形式呈现大根堆构建的理论过程
1、首先涉及到一个堆的调整,这也是算法的核心部分。假设树中,节点i的子树已经为两个大根堆。这两个子树再加上i节点的话,可能是大根堆也可能不是,因此需要对节点i进行调整。若i小于left(i) or right(i),需要将i下移。
2、这是一个例子,需要将4下移。满足大根堆的性质。
3、大根堆的调整算法。假设i节点的两个子树已经是大根堆。对应代码中MaxHeapify()函数。
4、算法正确性分析。
5、构建大根堆的过程中,只需要考虑n/2 + 1 之前的节点,因为之后的节点都是叶节点。
6、构建大根堆的算法。对应代码中MaxHeapCreat()函数
#include <stdio.h>#include <stdlib.h>#include <stdint.h>#include <assert.h>#include <string.h>/*目的:建立大根堆,也可以变成小根堆,核心:堆的调整输入:一系列来自文件的整数。文件中整数以空格隔开输出:大根堆*/void Swap(uint32_t* array, uint32_t i, uint32_t j){assert(array);uint32_t tmp;tmp = array[j];array[j] = array[i];array[i] = tmp;}/*大根堆调整*/void MaxHeapify(uint32_t* array, uint32_t heapSize, uint32_t currentNode){uint32_t leftChild, rightChild, largest;leftChild = 2*currentNode + 1;rightChild = 2*currentNode + 2;if(leftChild < heapSize && array[leftChild] > array[currentNode])largest = leftChild;elselargest = currentNode;if(rightChild < heapSize && array[rightChild] > array[largest])largest = rightChild;if(largest != currentNode){ Swap(array, largest, currentNode);MaxHeapify(array, heapSize, largest);}}/*构建大根堆*/void MaxHeapCreat(uint32_t* array, uint32_t heapSize){int i;for(i = heapSize/2; i >= 0; i--){MaxHeapify(array, heapSize, i);}}/*小根堆调整*/void MinHeapify(uint32_t* array, uint32_t heapSize, uint32_t currentNode){uint32_t leftChild, rightChild, minimum;leftChild = 2*currentNode + 1;rightChild = 2*currentNode + 2;if(leftChild < heapSize && array[leftChild] < array[currentNode])minimum = leftChild;elseminimum = currentNode;if(rightChild < heapSize && array[rightChild] < array[minimum])minimum = rightChild;if(minimum != currentNode){ Swap(array, minimum, currentNode);MinHeapify(array, heapSize, minimum);}}/*构建小根堆*/void MinHeapCreat(uint32_t* array, uint32_t heapSize){int i;for(i = heapSize/2; i >= 0; i--){MinHeapify(array, heapSize, i);}}int main(){uint32_t tmp;uint32_t *array;array = malloc(sizeof(uint32_t));int i, heapSize = 0;/*从文件中读出待排序数据*/ char* filePathway = "C:/Users/Administrator/Desktop/data.txt"; FILE* fp;fp = fopen(filePathway, "rb");if(!fp){ fprintf(stderr, "Can not open file correctly\n");}while(!feof(fp)){ fscanf(fp, "%d", &tmp); heapSize++; array = realloc(array, sizeof(uint32_t) * (heapSize )); if(array == NULL) { fprintf(stderr, "realloc error!\n"); return 1; } array[heapSize - 1] = tmp; } printf("The origen dataset:\n"); for(i = 0; i < heapSize; i++) { printf("%d\t", array[i]); } printf("\n"); /*构建小根堆并输出*/ MinHeapCreat(array, heapSize); printf("Output the MinHeap:\n"); for(i = 0; i < heapSize; i++) { printf("%d\t", array[i]); } printf("\n"); /*构建大根堆并输出*/ MaxHeapCreat(array, heapSize); printf("Output the MaxHeap:\n"); for(i = 0; i < heapSize; i++) { printf("%d\t", array[i]); } free(array);fclose(fp);return 0;}
- 大根堆和小根堆的C语言实现
- atoi和strcpy的C语言实现
- c语言中链表的概念和简单的实现
- C语言实现的BMP和JPEG图片的解码
- 计算PE文件校验和的C语言实现
- C语言实现的DDA和Bresenham直线算法
- 关于C语言中继承和多态的实现
- 函数 atoi() 和 itoa() 的 C 语言实现。
- C语言实现soap 客户端的提交和接收功能
- 线性表的顺序表示和实现(C语言描述)
- C语言的异常机制--setjump()和longjump()实现
- 快速排序和二分查找算法的实现C语言
- C语言多维数组的存储表示和实现
- C语言中memcpy、memset和memmove的实现
- C语言实现Unicode和UTF8之间的转换
- 关于C语言中继承和多态的实现
- 散列表的插入和检索(c语言实现)
- 通用线程池的设计和实现[C语言]
- 4clojure第43个问题逆向交错(Reverse Interleave)
- android学习笔记
- JAVA StringBuffer
- vc中__super的用法
- DOS命令大全--详解
- 大根堆和小根堆的C语言实现
- 数据库设计与应用开发
- 代码控制文件的打开
- 云风开发笔记(2) Redis数据库结构设计
- 21天学通oracle(第二版)笔记
- javascript 单元测试覆盖率工具,及Grunt集成
- DIV+CSS基础教程:导航条的制作详解
- 项目文档迁移到Seafile, 开源私有云服务 -- Akagi201
- 不错的资源地址