第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. 操作 ...
随机推荐
- Linux 08
1按照视频里提出的几点要求完善使ls命令模仿windows下dir命令输出的脚本 {printf $6" "$7" \t";if (substr($1,1,1) ...
- phpStorm注册马码
phpstorm已经升级到10.0,原注册码失效,10.0注册方法:注册时选择“License server”输入 http://idea.lanyus.com/ 此工具类工具一直没有让我失望
- C 各种数据类型介绍
1.各种数据类型介绍: 基本数据类型最主要的特点是,其值不可以再分解为其它类型.也就是说,基本数据类型是自我说明的. 1.1整型 整形包括短整型.整形和长整形. 1.1.1短整形 short a=1; ...
- discuz二次开发笔记(一)------$_G全解析
$_G 保存了 Discuz! 中所有的预处理数据缓存能够很好的提高程序的性能,一些配置数据没必要每次都查询数据库,只要在修改了的时候更新下缓存即可.Discuz! 中所有的缓存保存在 $_G[cac ...
- 图片与文字在div里实现垂直水平都居中
第一种方法,利用盒布局实现 <style type="text/css">/*盒布局实现图片与文字水平垂直居中*/ .div1{ width: 100%; heig ...
- 工作中的第一份LoadRunner脚本
录制的第一份脚本 虽然是第一份但是调试执行,跑场景等都成功了. Action() { web_url("login1.jsp", "URL=http://192.168. ...
- Android显示YUV图像
需要流畅显示YUV图像需要使用Opengl库调用GPU资源,网上在这部分的资料很少.实际上Android已经为我们提供了相关的Opengl方法 主体过程如下: 1.建立GLSurfaceView 2. ...
- Delphi Jpg和Gif转Bmp
begin bmp:=TBitmap.Create; jpeg:=TJPEGImage.Create; jpeg.LoadFromFile(fname); with b ...
- javascript预加载和延迟加载
延迟加载javascript,也就是页面加载完成之后再加载javascript,也叫on demand(按需)加载,一般有一下几个方法: What can your tired old page, o ...
- static wechat red package tool
---------------------------------------------------------------------------------------------------- ...