第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. 操作 ...
随机推荐
- windows server 2003进行相邻磁盘扩容(server 2008的直接右键就可以解决)
vCenter下的win server 2003 的D盘需要扩容,解决办法是,先将D盘由原来的200GB增加到了2TB(win server 2003选择MBR的限制),重启win server 20 ...
- iOS开发那些事儿(五)Objective-C浅拷贝与深拷贝
浅拷贝:copy操作出来的对象指针直接指向模板的地址.即两个对象公用一块内存地址 #import <Foundation/Foundation.h> int main(int argc, ...
- c语言合法标识符
#include <iostream>#include <stdio.h>using namespace std;char str[100][51];int main() { ...
- java线程管理
java线程管理 参见: http://harmony.apache.org/subcomponents/drlvm/TM.html 1. 修订历史 2. 关于本文档 2.1. 目的 2.2. 面向的 ...
- css案例学习之全局声明*{} 与body{}的区别
代码 <html> <head> <title>全局声明</title> <style type="text/css"> ...
- 用Express搭建 blog (一)
Info 公司马上要举行 hack day 了,这次决定和小伙伴用 Express 作为框架来搭建我们的应用,所以昨天搭出来UI后,今天开始系统的学习下 Express. Start 首先是expre ...
- web本地存储-UserData
userData,IE中持久化用户数据的方法. 使用userData用户数据首先必须使用css指定userData行为.代码示例: var ud = document.createElement(&q ...
- 解决Easyui1.3.3 IE8兼容性问题
事先声明:项目在Firefox和Chrome上完美运行,在MSIE9.MSIE10上基本没问题,但是放在MSIE8上面运行问题就出来了.登录系统后,系统页面跳动,导致系统无法使用:我使用的是Easyu ...
- mysql数据库学习(一)--基础
一.简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 R ...
- vim简单命令教程-firstblood
你想以最快的速度学习人类史上最好的文本编辑器VIM吗?你先得懂得如何在VIM幸存下来,然后一点一点地学习各种戏法. Vim the Six Billion Dollar editor Better, ...