当前位置:   article > 正文

算法设计之,堆,堆排序,基于最大堆的最大优先队列的实现(C++实现)_请设计void pop(heap h)函数。 已知优先队列h(最大堆)非空,该函数将h中的队首数据

请设计void pop(heap h)函数。 已知优先队列h(最大堆)非空,该函数将h中的队首数据

在上一篇文章中,我用数组直接存放堆中的元素,导致每次调用有关函数都要传入一个表示堆的大小的值,操作很不方便,今天我用结构体重新实现了堆和堆排序,并在最大堆的基础上实现了最大优先队列,最大优先队列的一个应用就是在共享计算机系统的作业调度中,最优先队列记录将要执行的各个作业以及他们之间的相对优先级。

说明一下,虽然堆排序在实际应用中的性能一般会低于快速排序。两者的时间复杂度均为O(nlgn),但是基于堆而构建的优先队列的性能却要好很多。有关优先队列的基本操作,其时间复杂度为O(lgn)。

下面是堆,堆排序,和基于堆的优先队列的C++实现

 

 

  1. <span style="font-size:24px;">// heap.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include "iostream"
  5. #define arrSize 100
  6. using namespace std;
  7. //用数组定义堆的数据结构,
  8. typedef struct
  9. {
  10. intarr[arrSize];
  11. intarrLength;//数组元素的个数,
  12. intheapSize;//表示有多少个堆元素存储在该数组中,
  13. //虽然arr[0..arrLength-1]都存有数据,但只有arr[0..heapSize-1]中存放的是堆的有效元素,
  14. //所以 0<=heapSize<=arrLength
  15. } Heap;
  16. //用于维护最大堆的性质,假定以 leftChild(i)和rightChild(i)为根节点的二叉树都是最大堆,
  17. //但是 arr[i] 可能小于其孩子,这就违背了最大堆的性质。通过该函数可以调整违反最大堆性质的
  18. //节点,从而使其保持堆的性质
  19. void maxHeapify(Heap*,int);
  20. void buildMaxHeap(Heap*);//构建一个最大堆
  21. void heapSort(Heap*);//利用最大堆进行堆排序
  22. int parent(int);//根据给定节点的下标 i ,计算它的父节点的下标。
  23. int leftChild(int);//根据给定节点的下标 i ,计算它的左孩子节点的下标。
  24. int rightChild(int);//根据给定节点的下标 i ,计算它的右孩子节点的下标。
  25. ///
  26. //以下是最大优先队列函数的声明
  27. int heapMaximum(Heap*);//返回堆中的最大元素
  28. int heapExtractMax(Heap*);//去掉并返回堆中的最大元素
  29. void heapIncreaseKey(Heap*,int i,intkey);//将元素 i 的值增加到 key。
  30. void maxHeapInsert(Heap*,int);//在最大堆中插入一个新元素。
  31. //
  32. //主函数
  33. int _tmain(int argc, _TCHAR* argv[])
  34. {
  35. intarr[]={4,1,3,2,16,9,10,14,8,7};
  36. Heapheap;
  37. Heap*pheap=&heap,* pheap2;
  38. pheap->arrLength=10;
  39. for(inti=0;i<pheap->arrLength;i++)
  40. pheap->arr[i]=arr[i];
  41. cout<<"原来数组的情况:";
  42. for(inti=0;i<pheap->arrLength;i++)
  43. cout<<pheap->arr[i]<<",";
  44. cout<<endl;
  45. //构建堆
  46. buildMaxHeap(pheap);
  47. pheap2=pheap;
  48. //输出构建后的堆
  49. cout<<"构建成堆后的数组值:";
  50. for(inti=0;i<pheap->heapSize;i++)
  51. cout<<pheap->arr[i]<<",";
  52. cout<<endl;
  53. ///
  54. //
  55. //返回堆中的最大元素
  56. cout<<"返回堆中的最大元素 : "<<heapMaximum(pheap)<<endl;
  57. //去掉并返回堆中的最大元素
  58. cout<<"去掉并返回堆中的最大元素 :"<<heapExtractMax(pheap)<<endl;
  59. cout<<"去掉最大元素后的堆中元素为:";
  60. for(inti=0;i<pheap2->heapSize;i++)
  61. cout<<pheap->arr[i]<<",";
  62. cout<<endl;
  63. cout<<"将元素 i 的值增加到 key,增大后堆的元素为:";
  64. //将元素 i 的值增加到 key。
  65. heapIncreaseKey(pheap,4,20);
  66. for(inti=0;i<pheap->heapSize;i++)
  67. cout<<pheap->arr[i]<<",";
  68. cout<<endl;
  69. //在最大堆中插入一个新元素。
  70. maxHeapInsert(pheap,30);
  71. cout<<"在最大堆中插入一个新元素后,堆中元素分布为 : ";
  72. for(inti=0;i<pheap->heapSize;i++)
  73. cout<<pheap->arr[i]<<",";
  74. cout<<endl;
  75. //测试堆排序
  76. heapSort(pheap);
  77. cout<<"堆排序后的结果 : ";
  78. //输出堆排序后的结果
  79. for(inti=0;i<pheap->arrLength;i++)
  80. cout<<pheap->arr[i]<<",";
  81. cout<<endl;
  82. return0;
  83. }
  84. //主函数结束
  85. //
  86. void maxHeapify(Heap* heap,int i)
  87. {
  88. intl = leftChild(i);
  89. intr = rightChild(i);
  90. intmaxIndex=0;
  91. if(l<=heap->heapSize-1&& heap->arr[l]>=heap->arr[i])
  92. maxIndex=l;
  93. else
  94. maxIndex= i;
  95. if(r<=heap->heapSize-1&&heap->arr[r]>=heap->arr[maxIndex])
  96. maxIndex= r;
  97. if(maxIndex!=i)
  98. {
  99. inttemp;
  100. temp= heap->arr[maxIndex];
  101. heap->arr[maxIndex]= heap->arr[i];
  102. heap->arr[i]= temp;
  103. maxHeapify(heap,maxIndex);
  104. }
  105. }
  106. /
  107. void buildMaxHeap(Heap* heap)
  108. {
  109. heap->heapSize = heap->arrLength;
  110. for(inti=heap->arrLength-1/2;i>=0;i--)
  111. maxHeapify(heap,i);
  112. }
  113. //
  114. int parent(int i)
  115. {
  116. if(i%2==0)
  117. i-=1;
  118. returni/2;
  119. }
  120. int leftChild(int i)
  121. {
  122. return2*i+1;
  123. }
  124. int rightChild(int i)
  125. {
  126. return2*(i+1);
  127. }
  128. ///
  129. void heapSort(Heap* heap)
  130. {
  131. buildMaxHeap(heap);
  132. for(inti=heap->arrLength-1;i>=0;i--)
  133. {
  134. inttemp;
  135. temp=heap->arr[0];
  136. heap->arr[0]=heap->arr[i];
  137. heap->arr[i]=temp;
  138. heap->heapSize -=1;
  139. maxHeapify(heap,0);
  140. }
  141. }
  142. //以下是最大优先队列函数的实现
  143. //返回堆中的最大元素
  144. int heapMaximum(Heap* heap)
  145. {
  146. returnheap->arr[0];
  147. }
  148. int heapExtractMax(Heap* heap)
  149. {
  150. if(heap->heapSize<0)
  151. cout<<"堆是空的"<<endl;
  152. intmax=heap->arr[0];
  153. heap->arr[0]=heap->arr[heap->heapSize-1];
  154. heap->heapSize-=1;
  155. maxHeapify(heap,0);
  156. returnmax;
  157. }
  158. void heapIncreaseKey(Heap* heap,int i,intkey)
  159. {
  160. i--;
  161. if(heap->arr[i]>key)
  162. cout<<"新值比当前值小"<<endl;
  163. heap->arr[i]=key;
  164. while(i>0&&heap->arr[parent(i)]<key)
  165. {
  166. inttemp =heap->arr[i];
  167. heap->arr[i]=heap->arr[parent(i)];
  168. heap->arr[parent(i)]=temp;
  169. i=parent(i);
  170. }
  171. }
  172. void maxHeapInsert(Heap* heap,int key)
  173. {
  174. heap->heapSize+=1;
  175. heap->arr[heap->heapSize-1]=-100;//假设用-100代替负无穷。
  176. heapIncreaseKey(heap,heap->heapSize,key);</span>


}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/943710
推荐阅读
  

闽ICP备14008679号