大根堆和小根堆的C语言实现
2013-03-12 20:52
1456 查看
大根堆小根堆的实现:以PPT形式呈现大根堆构建的理论过程
1、首先涉及到一个堆的调整,这也是算法的核心部分。假设树中,节点i的子树已经为两个大根堆。这两个子树再加上i节点的话,可能是大根堆也可能不是,因此需要对节点i进行调整。若i小于left(i) or right(i),需要将i下移。
2、这是一个例子,需要将4下移。满足大根堆的性质。
3、大根堆的调整算法。假设i节点的两个子树已经是大根堆。对应代码中MaxHeapify()函数。
4、算法正确性分析。
5、构建大根堆的过程中,只需要考虑n/2 + 1 之前的节点,因为之后的节点都是叶节点。
6、构建大根堆的算法。对应代码中MaxHeapCreat()函数
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; else largest = 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; else minimum = 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语言算法实现
- 大根堆-小根堆-堆排序-C实现
- 【数据结构】堆结构小根堆,大根堆,插入,删除等操作的实现
- minihttp安装配置ssl和c语言实现cgi
- C语言 素数求和(函数实现)
- C语言实现读写配置文件项目
- 利用C语言实现动态顺序表
- c语言手动实现反转链表 Reverse
- 常见排序算法(冒泡,选择,快速)的C语言实现
- 《算法导论》中红黑树的C语言实现
- 生产者-消费者问题实现 (linux下C语言)
- C语言实现的排序算法
- c语言实现vector实例
- C语言创建管道实现进程间通信
- C语言实现《设计模式之禅》之工厂模式——抽象工厂
- Boyer-Moore算法--C语言实现(简单易懂)
- C语言实现对顺序表的增删改查
- c语言一个链表的实现
- 数据结构——链栈的实现(C语言)
- linux环境下C语言实现非阻塞方式读取字符串数据的串口测试程序,即串口工具的编写