第6章 堆排序,d叉堆,优先队列
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define leftChild(i) (2*(i)+1)
//交换
void swap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
//堆下溯
void maxHeapify(int *a, int i, int n)
{
int child, tmp;
for (tmp = a[i]; leftChild(i)<n; i = child){
child = leftChild(i);
if (child != n - && a[child] < a[child + ]) ++child;
if (tmp < a[child]) a[i] = a[child];
else break;
}
a[i] = tmp;
}
//建立最大堆
void buildMaxHeap(int *a, int n)
{
for (int i = n / ; i >= ; --i)
maxHeapify(a, i, n);
}
//堆排序
void heapSort(int *a, int n)
{
for (int i = n / ; i >= ; --i)
maxHeapify(a, i, n);
for (int i = n - ; i > ; --i){
swap(a, , i);
maxHeapify(a, , i);
}
}
typedef struct _stack{
int *arr;
int pos;
}stack;
//创建一个空的优先队列
stack create(int capacity)
{
stack s;
s.pos = -;
s.arr = (int*)malloc(capacity*sizeof(int));
memset(s.arr, , capacity*sizeof(int));
return s;
}
//返回优先队列最大元素
int maxOfStack(stack &s)
{
return s.arr[];
}
//返回最大元素并删除
int extractMax(stack &s)
{
swap(s.arr,,s.pos);
--s.pos;
return s.arr[s.pos + ];
}
//增大指定元素到key
void increaseKey(stack &s, int i, int key)
{
if (i > s.pos) return;
if (key < s.arr[i]) return;
s.arr[i] = key;
while (i > && s.arr[i] > s.arr[(i - ) / ]){
swap(s.arr, i, (i - ) / );
i = (i - ) / ;
}
}
//插入元素
void insert(stack &s, int val)
{
++s.pos;
s.arr[s.pos] = val;
increaseKey(s, s.pos, val);
} //思考题6.2,d叉堆
void increaseKeyD(int *a, int i, int key,int d)
{
if (a[i] > key) return;
a[i] = key;
while (i > && a[i] > a[(i - ) / d]){
swap(a, i, (i - ) / d);
i = (i - ) / d;
}
} //思考题6.3,young氏矩阵
void maxHeapYoung(int *a, int i, int j, int m, int n)
{
int tmp, x, y;
while (tmp = a[i*n + j]){
x = i; y = j;
if (x < m - && y < n - ){
if (a[x*n + y + ] > a[(x + )*n + y]) ++x;
else ++y;
}
else if (x < m - ) ++x;
else if (y < n - ) ++y;
else break;
if (tmp > a[x*n + y]) a[i*n + j] = a[x*n + y];
else break;
i = x; j = y;
a[i*n + j] = tmp;
}
}
int main()
{
int a[] = { , , , ,-,-,, , , , };
stack s = create();
for (int i = ; i < ; ++i)
insert(s, a[i]);
for (int i = ; i <= s.pos; ++i)
printf("%d\t", s.arr[i]);
printf("\n");
int b[] = { , , , , , , , , };
maxHeapYoung(b, , , , );
for (int i = ; i < ; ++i)
printf("%d\t", b[i]);
printf("\n");
}
堆:stack
队列:queue
优先队列:priority_queue
for all
size_type
value_type
container_type
A a;
A a(c);
关系运算 == != < <= > >=
a.empty();
a.size();
swap(a,b);
a.swap(b);
for stack
stack<int>,默认基于deque实现;可以指定为list/vector,stack<int,vector<int>>
s.pop(); 删除
s.push(item); 入栈
s.emplace(args); 入栈
s.top(); 返回
for queue
queue<int>,默认基于deque,可指定list/vector,queue<int,vector<int>>
q.front();
q.back();
q.push(item);
q.emplace(args);
q.pop();
- for priority_queue
- prioriry_queue<int>默认基于vector,less<int>,可指定deque,greater<int>,priority_queue<int,deque<int>,greater<int>>
- pq.top();
- pq.push(item);
- pq.emplace(args);
- pq.pop();
第6章 堆排序,d叉堆,优先队列的更多相关文章
- 纯数据结构Java实现(6/11)(二叉堆&优先队列)
堆其实也是树结构(或者说基于树结构),一般可以用堆实现优先队列. 二叉堆 堆可以用于实现其他高层数据结构,比如优先队列 而要实现一个堆,可以借助二叉树,其实现称为: 二叉堆 (使用二叉树表示的堆). ...
- 《Algorithms算法》笔记:优先队列(2)——二叉堆
二叉堆 1 二叉堆的定义 堆是一个完全二叉树结构(除了最底下一层,其他层全是完全平衡的),如果每个结点都大于它的两个孩子,那么这个堆是有序的. 二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组 ...
- 图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)
[0]README 0.1)为什么有这篇文章?因为 Dijkstra算法的优先队列实现 涉及到了一种新的数据结构,即优先队列(二叉堆)的操作需要更改以适应这种新的数据结构,我们暂且吧它定义为Dista ...
- 二叉堆(一)之 图文解析 和 C语言的实现
概要 本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本 ...
- 二叉堆(二)之 C++的实现
概要 上一章介绍了堆和二叉堆的基本概念,并通过C语言实现了二叉堆.本章是二叉堆的C++实现. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的C++实现(完整源码)4. 二叉堆的C++测试程 ...
- 算法导论 第六章 堆排序(python)
6.1堆 卫星数据:一个带排序的的数通常是有一个称为记录的数据集组成的,每一个记录有一个关键字key,记录的其他数据称为卫星数据. 原地排序:在排序输入数组时,只有常数个元素被存放到数组以外的空间中去 ...
- 【425】堆排序方法(二叉堆)优先队列(PQ)
参考:漫画:什么是二叉堆? 大根堆 小根堆 参考:漫画:什么是堆排序? 参考:漫画:什么是优先队列? 参考:[video]视频--第14周10--第8章排序10--8.4选择排序3--堆排序2--堆调 ...
- python下实现二叉堆以及堆排序
python下实现二叉堆以及堆排序 堆是一种特殊的树形结构, 堆中的数据存储满足一定的堆序.堆排序是一种选择排序, 其算法复杂度, 时间复杂度相对于其他的排序算法都有很大的优势. 堆分为大头堆和小头堆 ...
- 结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆、斜堆
实现优先队列结构主要是通过堆完成,主要有:二叉堆.d堆.左式堆.斜堆.二项堆.斐波那契堆.pairing 堆等. 1. 二叉堆 1.1. 定义 完全二叉树,根最小. 存储时使用层序. 1.2. 操作 ...
随机推荐
- C# @字符用法
1.用 @ 符号加在字符串前面表示其中的转义字符“不”被处理. 如果我们写一个文件的路径,例如"D:/文本文件"路径下的text.txt文件,不加@符号的话写法如下: string ...
- 从一个小例子认识SQL游标
1 什么是游标: 关系数据库中的操作会对整个行集起作用. 例如,由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行. 这种由语句返回的完整行集称为结果集. 应用程序 ...
- 蜗牛爱课- iOS中plist的创建,数据写入与读取
iOS中plist的创建,数据写入与读取功能创建一个test.plist文件-(void)triggerStorage{ NSArray *paths=NSSearchPathForDirect ...
- [MFC]解决回车键 ESC 默认关闭窗口的一般方法
在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC键,程序就会立刻退出,之所以会这样,是因为按下Enter键时,Windows就会自动去找输入焦点落在了哪一个按钮上, ...
- Android Studio 没有assets目录的问题
Where to place the assets folder in Android Studio If you are having problems with asset files not ...
- HTML 语义化
语义化,让你的网页更好的被搜索引擎理解 要记住学习html标签过程中,主要注意两个方面的学习:标签的用途.标签在浏览器中的默认样式. 标签的用途:我们学习网页制作时,常常会听到一个词,语义化.那么什么 ...
- ecshop给虚拟商品添加出售和未出售的导出xlc
在admin/virtral_card.php文件中找到$_REQUEST['act'] == 'card'这里是用来显示某一个虚拟商品的出售记录的列表将会发送到replenish_list.htm在 ...
- MFC 双缓冲加载背景
首先定义DCmemDc和Bitmap CDC DCmemDc: CBitmap memBitmap; CBitmap *oldBitmap; 然后创建一个适应当前内存的DCmemDc CDC * dc ...
- Codeforces 339E
#include <cstdio> #include <algorithm> #include <cmath> #include <cstring> # ...
- OpenStreetMap(OSM) JMap Viewer(Java swing map)
This article from:http://wiki.openstreetmap.org/wiki/JMapViewer JMapViewer is a java component which ...