`
holoblog
  • 浏览: 1255867 次
博客专栏
E0fcf0b7-6756-3051-9a54-90b4324c9940
SQL Server 20...
浏览量:19410
文章分类
社区版块
存档分类
最新评论

编程练习——堆heap

 
阅读更多

因为vs2005中c++的Heap构造有些问题,所以才重写了heap类。

不知道vs2008中这个是不是个bug。

  1. /*createdbychicochen
  2. *date2008/10/25
  3. */
  4. template<classT,classCmp>
  5. classHeap
  6. {
  7. private:
  8. vector<T>heap;
  9. voidShiftDown(intindex)
  10. {
  11. while(!IsLeaf(index))
  12. {
  13. intl=Lchild(index);
  14. intr=Rchild(index);
  15. if(r!=-1)
  16. {
  17. if(Cmp::Up(heap[r],heap[l]))
  18. {
  19. //puttheupnodetotheleft
  20. swap(heap[l],heap[r]);
  21. }
  22. }
  23. if(Cmp::Up(heap[l],heap[index]))
  24. {
  25. //uptheleftchild
  26. swap(heap[l],heap[index]);
  27. index=l;
  28. }
  29. else
  30. {
  31. break;
  32. }
  33. }
  34. }
  35. voidShiftUp(intindex)
  36. {
  37. intparent=-1;
  38. while(index!=0)
  39. {
  40. parent=Parent(index);
  41. if(Cmp::Up(heap[index],heap[parent]))
  42. {
  43. swap(heap[index],heap[parent]);
  44. index=parent;
  45. }
  46. else
  47. {
  48. break;
  49. }
  50. }
  51. }
  52. voidReHeapAll()
  53. {
  54. for(inti=Parent(heap.size()-1);i>=0;i--)
  55. {
  56. ShiftDown(i);
  57. }
  58. }
  59. voidReHeapOne(intindex)
  60. //setonepriorandre-positiontheindexnode
  61. {
  62. Tdata=heap[index];
  63. ShiftDown(index);
  64. if(Cmp::Eq(data,heap[index]))
  65. {
  66. ShiftUp(index);
  67. }
  68. }
  69. intParent(intindex)
  70. //parentnodeoftheindexnode
  71. {
  72. return(index-1)/2;
  73. }
  74. intLchild(intindex)
  75. //Leftchildoftheindexnode
  76. {
  77. if(!IsLeaf(index))
  78. returnindex*2+1;
  79. return-1;
  80. }
  81. intRchild(intindex)
  82. //Rightchildoftheindexnode
  83. {
  84. if(!IsLeaf(index))
  85. {
  86. intr=index*2+2;
  87. if(r<heap.size())
  88. returnr;
  89. }
  90. return-1;
  91. }
  92. intIsLeaf(intindex)
  93. {
  94. assert(index<heap.size());
  95. if(heap.size()==1)
  96. returntrue;
  97. intlastNode=Parent(heap.size()-1);
  98. returnlastNode<index;
  99. }
  100. intFindData(T&data)
  101. {
  102. intlen=heap.size();
  103. for(inti=0;i<len;i++)
  104. {
  105. if(Cmp::Eq(data,heap[i]))
  106. {
  107. returni;
  108. }
  109. }
  110. return-1;//cannotfindthedata
  111. }
  112. voidprintTree(intindex,intcount)
  113. {
  114. if(index<heap.size()&&index>=0)
  115. {
  116. printTree(Rchild(index),count+4);
  117. for(inti=0;i<count;i++)
  118. {
  119. cout<<"";
  120. }
  121. cout<<heap[index]<<endl;
  122. printTree(Lchild(index),count+4);
  123. }
  124. }
  125. public:
  126. Heap()
  127. {
  128. heap=vector<T>();
  129. }
  130. ~Heap()
  131. {
  132. //heapdestroyed
  133. }
  134. boolIsEmpty()
  135. {
  136. returnheap.size()==0;
  137. }
  138. voidInsert(T&data)
  139. {
  140. heap.push_back(data);
  141. ShiftUp(heap.size()-1);
  142. }
  143. voidDelete(intindex)
  144. {
  145. intlast=heap.size()-1;
  146. if(index>=0&&index<=last)
  147. {
  148. swap(heap[index],heap[last]);
  149. heap.pop_back();
  150. ReHeapOne(index);
  151. }
  152. }
  153. voidDelete(T&data)
  154. {
  155. intindex=FindData(data);
  156. if(index!=-1)
  157. Delete(index);
  158. }
  159. voidRemoveTop()
  160. {
  161. if(!IsEmpty()&&heap.size()>1)
  162. {
  163. swap(heap[0],heap[heap.size()-1]);
  164. heap.pop_back();
  165. ShiftDown(0);
  166. }
  167. elseif(heap.size()==1)
  168. {
  169. heap.pop_back();
  170. }
  171. }
  172. T&Top()
  173. {
  174. returnheap[0];
  175. }
  176. voidPrint()
  177. {
  178. printTree(0,1);
  179. }
  180. };
分享到:
评论

相关推荐

    数据结构复习

    8. **堆(Heap)** 堆是一种特殊的树形数据结构,满足最大堆或最小堆性质。堆常用于实现优先队列和优化排序算法(如堆排序)。 9. **排序(Sorting)** 掌握各种排序算法如冒泡排序、选择排序、插入排序、快速...

    Data Structures Using C

    ### 数据结构与C语言 ...通过这本书,读者不仅可以学到各种数据结构的基本原理和特性,还能通过实际编程练习来提升自己的编程技能。无论是对于学生还是专业程序员来说,这本书都是一个宝贵的资源。

    c代码-排序:选择排序与堆排序

    本资源包含关于两种常见的排序算法——选择排序(Selection Sort)和堆排序(Heap Sort)的C语言实现,这对于理解和掌握这两种算法的运作机制非常有帮助。 选择排序是一种简单直观的排序算法。它的基本思想是,对待...

    排序和查找算法.rar

    在面试中,快速排序和堆排序通常会作为重点提问,因为它们代表了两种不同的高效排序策略——分治法和堆数据结构的运用。 总之,"排序和查找算法"是计算机科学的基础,理解并掌握这些算法对于提升编程技能和解决问题...

    ocaml-diary:OCaml 练习和例子的日记

    本资料集合——"ocaml-diary",提供了一系列OCaml编程的练习和示例,涵盖了基础到进阶的数据结构,包括列表、队列、堆和树,以及欧拉文件等。以下是对这些主题的深入解析: 1. **列表(List)**:OCaml中的列表是不可...

    S3C2410完全开发流程

    - **Step4:heap_init()** —— 初始化堆空间。 - **Step5:mtd_dev_init()** —— 初始化MTD设备。 - **Step6:init_priv_data()** —— 初始化私有数据结构。 - **Step7:misc() 和 init_builtin_cmds()** ...

    Haskell-Data-Structure:在Haskell中练习数据结构

    4. **堆(Heap)**:堆是一种特殊的树形数据结构,每个父节点的值都大于或等于(最大堆)或小于或等于(最小堆)其子节点的值。在Haskell中,可以使用`Data.Heap`模块实现优先队列,堆常用于排序算法(如堆排序)和...

    Data-Structure

    8. **堆(Heap)**:堆是一种特殊的树形数据结构,满足堆属性(最大堆或最小堆)。在C语言中,堆常用于实现优先队列。 9. **字符串(String)**:虽然C语言标准库提供了`&lt;string.h&gt;`来处理字符串,但理解字符串的...

    suanfa:算法与数据结构

    《算法与数据结构——Python实现》 在计算机科学中,算法和数据结构是核心概念,它们构成了编程的基础。算法是解决问题或执行特定任务的步骤序列,而数据结构则是存储和组织数据的方式。Python语言以其简洁易读的...

    algorithm-study

    例如,堆(Heap)常用于优先队列,而哈希表(HashMap)则提供快速的查找功能。 四、算法复杂度分析 每个算法都有其时间和空间复杂度,这是衡量算法效率的重要指标。项目可能包含了对每个算法的时间复杂度(O ...

    data-structure-in-7days:python中的数据结构

    在Python中,还有其他一些高级数据结构,如堆(Heap)、链表(LinkedList)和图(Graph)等,它们可以通过第三方库如heapq和networkx来实现。了解和熟练掌握这些数据结构及其操作,对于提升编程能力、优化算法效率至关重要...

    algodeck:200多种算法闪存卡的开源集合,可帮助您准备算法和数据结构面试:hundred_points:

    《算法闪存卡: algodeck —— 200多种算法面试必备工具》 在IT行业中,算法和数据结构是面试中不可或缺的部分,对于程序员来说,熟练掌握这些知识至关重要。今天我们要介绍的是一个名为“algodeck”的开源项目,它...

    获取qq进程的所有信息(源码只为初学者)

    本文将针对初学者,详细讲解如何获取QQ进程及其线程的相关信息,并以一个简单的实例——"thread2"为例,带你走进这个话题。 首先,我们要明白什么是进程和线程。在操作系统中,进程是程序在内存中的执行实例,每个...

Global site tag (gtag.js) - Google Analytics