最小优先级队列 — 使用最小堆实现
来源:互联网 发布:ubuntu共享文件夹 mac 编辑:程序博客网 时间:2024/06/06 03:42
最小优先级支持的操作:
1.INSERT(S,x):将元素x插入队列S
2.MINIMUM(S):返回S中最小的元素
3.EXTRACT_MIN(S):去掉并返回S中最小的元素
4.DECREASE_KEY(S,x,key):将下标为x的元素值降低为key
使用最小堆实现最小优先级队列。最小堆是一个完全二叉树,从编号1开始:
注意几个操作:向下调整(建堆、调整堆),向上调整(建堆后,插入元素、更改元素)、heap_size的应用和变化
//最小优先级队列
#include<stdio.h>
#include<stdlib.h>
int heap_size = 0;
int parent(int i){
return i/2;
}
int left_child(int i){
return 2*i;
}
int right_child(int i){
return 2*i+1;
}
void swap(int * a, int * b){
int c = *a;
*a = *b;
*b = c;
}
void heap_adjust(int *arr, int i){
int min = i;
int left = left_child(i);
int right = right_child(i);
if(left<=heap_size && arr[left] < arr[min]){
min = left;
}
if(right<=heap_size && arr[right] < arr[min]){
min = right;
}
if(min != i){
swap(&arr[i],&arr[min]);
heap_adjust(arr,min);
}
}
void heap_create(int * arr, int num){
if(NULL == arr){
return;
}
int i = 0;
heap_size = num;
for(i=num/2; i>=1; i--){
heap_adjust(arr,i);
}
}
void heap_sort(int * arr){
while(heap_size > 1){
swap(&arr[1],&arr[heap_size]);
heap_size --;
heap_adjust(arr,1);
}
}
//将元素x插入队列
void insert(int * arr, int x){
heap_size++;
arr[heap_size] = x;
int i=0;
for(i=heap_size/2; i>=1; i--){
heap_adjust(arr,i);
}
}
//返回队列中最小的元素
int minimum(int * arr){
return arr[1];
}
//去掉并返回队列中最小的元素
int extract_min(int *arr){
int min = arr[1];
arr[1] = arr[heap_size];
heap_size--;
heap_adjust(arr,1);
return min;
}
//将下标为x的元素值降低为key
void decrease_key(int * arr, int x, int key){
if(x >=1 && x<=heap_size){
arr[x] = key;
while(parent(x) >= 1 && arr[parent(x)] > arr[x]){
swap(&arr[parent(x)],&arr[x]);
x = parent(x);
}
}
}
//借助上函数实现插入元素x到队列
void insert2(int * arr, int x){
heap_size++;
arr[heap_size] = x;
decrease_key(arr,heap_size,x);
}
int main(){
int i,n;
int arr[100];
scanf("%d",&n);
for(i=1; i<=n; i++){
scanf("%d",&arr[i]);
}
heap_create(arr,n);
//heap_sort(arr);
//printf("%d\n",minimum(arr));
//printf("%d\n",extract_min(arr));
//insert(arr,1);
//decrease_key(arr,3,1);
insert2(arr,19);
for(i=1; i<=heap_size; i++){
printf("%d ",arr[i]);
}
system("pause");
return 0;
}
- 最小优先级队列 — 使用最小堆实现
- 堆实现的最小优先级队列
- 最小优先级队列(基于最小二叉堆算法)
- 最小优先队列--堆实现
- 最小优先级队列
- 最小堆优先队列C++实现
- 用最小堆实现优先队列
- 简单优先队列实现-基于最小堆
- 数据结构实现之最小优先队列(最小堆)
- C++实现优先队列——最小堆,d路堆及配对堆
- (五)使用最大堆实现优先级队列
- 最小优先级队列(数组表示)
- 基于最小二叉堆的优先级队列-C#实现,以此为基础的K路合并排序算法
- 优先级队列---使用堆
- 最小堆及基于最小堆的最小优先队列
- 优先队列(最小堆)
- 最小堆模拟优先队列
- 最小堆的实现
- python 第一天
- MFC点点滴滴——打开文件夹并枚举所有文件(总结)
- Memcached在大型网站中应用
- EDMA3模块及其在AIF接口中的应用
- linux相关帖子搜集,欢迎跟帖加入你知道的比较好的linux地址。【第一次整理】
- 最小优先级队列 — 使用最小堆实现
- 贪心算法的几个应用
- JOGL
- 如何取消windows xp开机时的登录界面
- Windows7的Ntdll.dll文件的Message table.
- 指什么快捷用法呢?给你一个Windows XP的快捷键大全吧。
- 【入门恩师】 --极致强压下的Linux学习,感谢马哥
- Memcached 基础知识
- tips: about thermal paste on laptop