第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. 操作 ...
随机推荐
- 06JS高级创建对象使用原型共享对象方法
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- Oracle入门学习笔记
参考文献 中文教程 http://wenku.baidu.com/view/b425f404e87101f69e319566.html 经典教程 http://wenku.baidu. ...
- Eclipse开启Mybatis-config.xml配置文件智能提示
使用Java开发的程序员一般在学习的时候,可能都会涉及到使用配置文件,在使用Eclipse类似IDE进行编辑配置配置文件的时候,如果配置文件不能自动联想,是一件比较恼人的事情.笔者这里拿mybatis ...
- fragment之间的信息交互——onActivityResult()不经过Activity
1.本文讲述如何fragment与fragment之间互传信息,不用使用Activity的onActivityResult()方法 核心思想:FirstFragment获取到SecondFragmen ...
- 推荐两个Laravel插件网站
1.https://packagist.org 2.http://packalyst.com
- 打造坚固的安全的Linux服务器(ssh登录篇)
Nov 3 01:22:06 server sshd[11879]: Failed password for root from 123.127.5.131 port 38917 ssh2Nov ...
- WPF学习:绑定
原文 http://www.cnblogs.com/SouthAurora/archive/2010/06/30/1768464.html 一.绑定到元素对象 1.元素和元素(XAML.代码) 1.1 ...
- service:jmx:rmi:///jndi/rmi
service:jmx:rmi:///jndi/rmi://ip:9889/jmxrmi http://stackoverflow.com/questions/2768087/explain-jmx- ...
- Javascript基本算法演练 Seek and Destroy
转载自:http://aeroj-blog.logdown.com/posts/435808 Seek and Destroy You will be provided with an initial ...
- LOL是什么意思? - 已解决 - 搜狗问问
LOL是什么意思? - 已解决 - 搜狗问问 N A T S U . |分类:QQ工具栏 2009-05-04 LOL是什么意思? 满意答案 Shim Nyong 19级 2009-05-04 LOL ...