斜堆
2016-05-23 20:11
344 查看
数据结构与算法分析——c语言描述 第六章
SkewHeap.h
SkewHeap.c
main.c
SkewHeap.h
#ifndef _SkewHeap_H #define _SkewHeap_H typedef int ElementType; struct TreeNode; typedef struct TreeNode *PriorityQueue; PriorityQueue initialize(void); ElementType findMin(PriorityQueue h); int isEmpty(PriorityQueue h); PriorityQueue merge(PriorityQueue h1, PriorityQueue h2); #define insert(X,H) (H=insert1((X),H)) PriorityQueue insert1(ElementType X, PriorityQueue h); PriorityQueue deleteMin1(PriorityQueue h); #define deleteMin(H) (H=deleteMin1(H)) #endif // !_BinHeap_H
SkewHeap.c
#include"SkewHeap.h" #include"fatal.h" struct TreeNode { ElementType element; PriorityQueue left; PriorityQueue right; }; PriorityQueue initialize(void) { return NULL; } ElementType findMin(PriorityQueue h) { if (isEmpty(h)) Error("EMPTY HEAP"); return h->element; } int isEmpty(PriorityQueue h) { return h == NULL; } static PriorityQueue merge1(PriorityQueue h1, PriorityQueue h2) { if (h1->left == NULL) { h1->left = h2; return h1; } else { h1->right = merge(h1->right, h2); PriorityQueue temp; temp = h1->right; h1->right = h1->left; h1->left = temp; return h1; } } PriorityQueue merge(PriorityQueue h1, PriorityQueue h2) { if (h1 == NULL) return h2; else if (h2 == NULL) return h1; else { if (h1->element < h2->element) return merge1(h1, h2); else return merge1(h2, h1); } } PriorityQueue insert1(ElementType X, PriorityQueue h) { PriorityQueue newNode = malloc(sizeof(struct TreeNode)); newNode->element = X; newNode->left = NULL; newNode->right = NULL; return merge(newNode, h); } PriorityQueue deleteMin1(PriorityQueue h) { PriorityQueue temp1 = h->left; PriorityQueue temp2 = h->right; free(h); return merge(temp1, temp2); }
main.c
#include"SkewHeap.h" #include<stdlib.h> #include<stdio.h> int RandInt(int i, int j) { int temp; temp = (int)(i + (1.0*rand() / RAND_MAX)*(j - i)); return temp; } void getRandomInt(int *A, int n) { for (int i = 0; i < n; i++) { A[i] = i + 1; } for (int i = 1; i < n; i++) { //std::swap(A[i], A[RandInt(0, i)]); int randAdrr = RandInt(0, i); int t = A[i]; A[i] = A[randAdrr]; A[randAdrr] = t; } } int a[99999999]; int main() { int n; scanf("%d", &n); //int *a = malloc(sizeof(int)*n); //if (a == NULL) // fprintf(stderr,"out of memory"); getRandomInt(a, n); PriorityQueue h1 = initialize(); PriorityQueue h2 = initialize(); int i; for (i = 0; i < n / 2; i++) insert(a[i], h1); for (; i < n; i++) insert(a[i], h2); PriorityQueue h = merge(h1, h2); for (int i = 0; i < n; i++) { printf("%d ", findMin(h)); deleteMin(h); } //destroy(h); //free(a); }
相关文章推荐
- C++中skipws、ws两者有什么区别
- 【经典算法】:把String变为double型的方法
- <TextArea> 中存在\t \n \r 的解决方法
- selenium webdriver+testng自定义html测试报告
- 安卓测试
- C++读写文件
- 如何处理异常? catch Exception OR catch Throwable
- Linux的IO模型
- express-session(express4.0与express 3.0的区别)
- bash shell总结
- 欧拉筛模板
- Python Neurolab for neural network
- 关于mybatis用mysql时,插入返回自增主键的问题
- 第十三周项目58-分数类中的运算符重载
- 样式表
- ios 修改导航栏的颜色
- 关于帧中继和ppp的补充笔记
- MyBatis Review——延时加载
- 数学专题---博弈论【更新中】
- 关于java多线程的个人解答