因为vs2005中c++的Heap构造有些问题,所以才重写了heap类。
不知道vs2008中这个是不是个bug。
-
-
template<classT,classCmp>
-
classHeap
- {
-
private:
- vector<T>heap;
-
voidShiftDown(intindex)
- {
-
while(!IsLeaf(index))
- {
-
intl=Lchild(index);
-
intr=Rchild(index);
-
if(r!=-1)
- {
-
if(Cmp::Up(heap[r],heap[l]))
- {
-
- swap(heap[l],heap[r]);
- }
- }
-
if(Cmp::Up(heap[l],heap[index]))
- {
-
- swap(heap[l],heap[index]);
- index=l;
- }
-
else
- {
-
break;
- }
- }
- }
-
voidShiftUp(intindex)
- {
-
intparent=-1;
-
while(index!=0)
- {
- parent=Parent(index);
-
if(Cmp::Up(heap[index],heap[parent]))
- {
- swap(heap[index],heap[parent]);
- index=parent;
- }
-
else
- {
-
break;
- }
- }
- }
-
voidReHeapAll()
- {
-
for(inti=Parent(heap.size()-1);i>=0;i--)
- {
- ShiftDown(i);
- }
- }
-
voidReHeapOne(intindex)
-
- {
- Tdata=heap[index];
- ShiftDown(index);
-
if(Cmp::Eq(data,heap[index]))
- {
- ShiftUp(index);
- }
- }
-
intParent(intindex)
-
- {
-
return(index-1)/2;
- }
-
intLchild(intindex)
-
- {
-
if(!IsLeaf(index))
-
returnindex*2+1;
-
return-1;
- }
-
intRchild(intindex)
-
- {
-
if(!IsLeaf(index))
- {
-
intr=index*2+2;
-
if(r<heap.size())
-
returnr;
- }
-
return-1;
- }
-
intIsLeaf(intindex)
- {
- assert(index<heap.size());
-
if(heap.size()==1)
-
returntrue;
-
intlastNode=Parent(heap.size()-1);
-
returnlastNode<index;
- }
-
intFindData(T&data)
- {
-
intlen=heap.size();
-
for(inti=0;i<len;i++)
- {
-
if(Cmp::Eq(data,heap[i]))
- {
-
returni;
- }
- }
-
return-1;
- }
-
voidprintTree(intindex,intcount)
- {
-
if(index<heap.size()&&index>=0)
- {
- printTree(Rchild(index),count+4);
-
for(inti=0;i<count;i++)
- {
-
cout<<"";
- }
- cout<<heap[index]<<endl;
- printTree(Lchild(index),count+4);
- }
- }
-
public:
- Heap()
- {
- heap=vector<T>();
- }
- ~Heap()
- {
-
- }
-
boolIsEmpty()
- {
-
returnheap.size()==0;
- }
-
voidInsert(T&data)
- {
- heap.push_back(data);
- ShiftUp(heap.size()-1);
- }
-
voidDelete(intindex)
- {
-
intlast=heap.size()-1;
-
if(index>=0&&index<=last)
- {
- swap(heap[index],heap[last]);
- heap.pop_back();
- ReHeapOne(index);
- }
- }
-
voidDelete(T&data)
- {
-
intindex=FindData(data);
-
if(index!=-1)
- Delete(index);
- }
-
voidRemoveTop()
- {
-
if(!IsEmpty()&&heap.size()>1)
- {
- swap(heap[0],heap[heap.size()-1]);
- heap.pop_back();
- ShiftDown(0);
- }
-
elseif(heap.size()==1)
- {
- heap.pop_back();
- }
- }
- T&Top()
- {
-
returnheap[0];
- }
-
voidPrint()
- {
- printTree(0,1);
- }
- };
分享到:
相关推荐
8. **堆(Heap)** 堆是一种特殊的树形数据结构,满足最大堆或最小堆性质。堆常用于实现优先队列和优化排序算法(如堆排序)。 9. **排序(Sorting)** 掌握各种排序算法如冒泡排序、选择排序、插入排序、快速...
### 数据结构与C语言 ...通过这本书,读者不仅可以学到各种数据结构的基本原理和特性,还能通过实际编程练习来提升自己的编程技能。无论是对于学生还是专业程序员来说,这本书都是一个宝贵的资源。
本资源包含关于两种常见的排序算法——选择排序(Selection Sort)和堆排序(Heap Sort)的C语言实现,这对于理解和掌握这两种算法的运作机制非常有帮助。 选择排序是一种简单直观的排序算法。它的基本思想是,对待...
在面试中,快速排序和堆排序通常会作为重点提问,因为它们代表了两种不同的高效排序策略——分治法和堆数据结构的运用。 总之,"排序和查找算法"是计算机科学的基础,理解并掌握这些算法对于提升编程技能和解决问题...
本资料集合——"ocaml-diary",提供了一系列OCaml编程的练习和示例,涵盖了基础到进阶的数据结构,包括列表、队列、堆和树,以及欧拉文件等。以下是对这些主题的深入解析: 1. **列表(List)**:OCaml中的列表是不可...
- **Step4:heap_init()** —— 初始化堆空间。 - **Step5:mtd_dev_init()** —— 初始化MTD设备。 - **Step6:init_priv_data()** —— 初始化私有数据结构。 - **Step7:misc() 和 init_builtin_cmds()** ...
4. **堆(Heap)**:堆是一种特殊的树形数据结构,每个父节点的值都大于或等于(最大堆)或小于或等于(最小堆)其子节点的值。在Haskell中,可以使用`Data.Heap`模块实现优先队列,堆常用于排序算法(如堆排序)和...
8. **堆(Heap)**:堆是一种特殊的树形数据结构,满足堆属性(最大堆或最小堆)。在C语言中,堆常用于实现优先队列。 9. **字符串(String)**:虽然C语言标准库提供了`<string.h>`来处理字符串,但理解字符串的...
《算法与数据结构——Python实现》 在计算机科学中,算法和数据结构是核心概念,它们构成了编程的基础。算法是解决问题或执行特定任务的步骤序列,而数据结构则是存储和组织数据的方式。Python语言以其简洁易读的...
例如,堆(Heap)常用于优先队列,而哈希表(HashMap)则提供快速的查找功能。 四、算法复杂度分析 每个算法都有其时间和空间复杂度,这是衡量算法效率的重要指标。项目可能包含了对每个算法的时间复杂度(O ...
在Python中,还有其他一些高级数据结构,如堆(Heap)、链表(LinkedList)和图(Graph)等,它们可以通过第三方库如heapq和networkx来实现。了解和熟练掌握这些数据结构及其操作,对于提升编程能力、优化算法效率至关重要...
《算法闪存卡: algodeck —— 200多种算法面试必备工具》 在IT行业中,算法和数据结构是面试中不可或缺的部分,对于程序员来说,熟练掌握这些知识至关重要。今天我们要介绍的是一个名为“algodeck”的开源项目,它...
本文将针对初学者,详细讲解如何获取QQ进程及其线程的相关信息,并以一个简单的实例——"thread2"为例,带你走进这个话题。 首先,我们要明白什么是进程和线程。在操作系统中,进程是程序在内存中的执行实例,每个...