小白进阶之优先队列排序
来源:互联网 发布:pdf生成器软件 编辑:程序博客网 时间:2024/06/05 23:40
优先队列排序是堆的常见应用。优先队列和堆一样,有两种形式:最大优先队列和最小优先队列。
此处是基于最大堆实现最大优先队列。最大优先队列的应用有很多,其中一个就是在共享计算机系统的作业调度。
下面是代码:
"priorityQueue.h"
#include<stdio.h>#include<limits.h>#include<stdlib.h>int heapMaximun(int *a);//返回队列中的最大值int heapExtractMax(int *a,int n);//去掉并返回最大值void heapIncreaseKey(int *a,int n,int i,int k);//将第i个数组元素的值提高到kvoid maxHeapInsert(int *a,int n,int k);//把k插入到队列中"priorityQueue.cpp"
#include"priorityQueue.h"int parent(int i){int j=i/2;return j;}int left(int i){return 2*i;}int right(int i){return 2*i+1;}void maxHeapify(int *a,int n,int i){int l,r,max,t;l=left(i);r=right(i);if((l<=n)&&(a[l-1]>a[i-1]))max=l;else max=i;if((r<=n)&&(a[r-1]>a[max-1]))max=r;if(max!=i){t=a[i-1];a[i-1]=a[max-1];a[max-1]=t;maxHeapify(a,n,max);}}void buildMaxHeap(int *a,int n){int i;for(i=n/2;i>=0;i--){maxHeapify(a,n,i+1);}for(i=0;i<n;i++){printf("%d ",a[i]);}}int heapMaximun(int *a,int n){buildMaxHeap(a,n);return a[0];}int heapExtractMax(int *a,int n){buildMaxHeap(a,n);printf("\n");if(n<1){printf("error:heap underflow");return 0;}int max=a[0];a[0]=a[n-1];n=n-1;maxHeapify(a,n,1);for(int i=0;i<n;i++)printf("%d ",a[i]);printf("\n");return max;}void heapIncreaseKey(int *a,int n,int i,int k){buildMaxHeap(a,n);printf("\n");if(k<a[i-1]){printf("error:new key is smaller than current key.");return ;}a[i-1]=k;while((i-1>0)&&(a[parent(i)-1]<a[i-1])){int t=a[i-1];a[i-1]=a[parent(i)-1];a[parent(i)-1]=t;i=parent(i);}for(int i=0;i<n;i++)printf("%d ",a[i]);printf("\n");}void maxHeapInsert(int *a,int n,int k){buildMaxHeap(a,n);printf("\n");n=n+1;a[n]=INT_MIN;heapIncreaseKey(a,n,n,k);for(int i=0;i<n;i++)printf("%d ",a[i]);}"main.cpp"
#include"priorityQueue.h"int main(){int *a,*b,*c,n,i,x,k;printf("Please input the number of array:\n");scanf("%d",&n);a=(int *)malloc(sizeof(int)*n);b=(int *)malloc(sizeof(int)*n);c=(int *)malloc(sizeof(int)*n);printf("Plaease input the array:\n");for(i=0;i<n;i++){scanf("%d",&a[i]);b[i]=a[i];c[i]=a[i];}int max=heapExtractMax(a,n);printf("%d\n",max);printf("Please input the number of increase element and the key:\n");scanf("%d %d",&x,&k);heapIncreaseKey(b,n,x,k);printf("Please input the key to be inserted:\n");scanf("%d",&k);maxHeapInsert(c,n,k);system("pause");return 0;}这次实现的话,问题主要是我忘记要建堆了,就直接按照伪码来写,当然结果不对啦~
还有就是每次函数调用都要重新建堆,要不然上次函数调用就改变了数组的堆,结果当然也不对~
0 0
- 小白进阶之优先队列排序
- 小白进阶之堆排序
- 小白进阶之快速排序
- 优先队列之堆排序(一)
- 小白进阶之冒泡排序、归并排序、选择排序、冒泡排序
- 优先队列 之 堆排序实现(堆排序思想)
- 小白进阶之线性排序算法之计数排序、基数排序和桶排序
- 优先队列排序:先偶后奇
- 优先队列自动排序
- 优先队列多级排序
- Codevs_P1076 排序(优先队列)
- 优先队列-堆排序
- 拓扑排序+优先队列
- 优先队列排序
- 拓扑排序+优先队列
- 队列优先 之 插入排序实现(插入思想)
- 堆排序应用之优先队列的实现
- 优先队列之堆排序((二)升级版)
- 【深度学习笔记】深度学习用于图片的分类和检测总结
- 如果我来导演,《魔兽2》会这样拍……
- 约瑟夫环问题的两种解决方式(递归求解和数组模拟求解)
- 第16周项目1--小玩文件(2)
- Android技术揭秘之activity堆栈管理
- 小白进阶之优先队列排序
- YUV格式说明
- MVN 安装 JAR包
- 简单分包传输协议
- Best Time to Buy and Sell Stock 买卖股票的最好时间
- songtaste资源下载程序
- java网络编程
- 幻灯片ppt和pps的区别
- 负数求余