Data Structures (Weiss) Chapter 6: Binary Heap, Priority Queue
2013-07-10 14:47
260 查看
//
// main.cpp
// Data Structure TRY1
//
// Created by zr9558 on 6/7/13.
// Copyright (c) 2013 zr9558. All rights reserved.
//
// Data Structure C++, Weiss, P.216 Priority Queues (Heaps)
// Here, we do not use array[0], the priority queue is from array[1].
#include<iostream>
using namespace
std;
#include<vector>
#include<list>
#include<algorithm>
template<typename Comparable>
class BinaryHeap
{
public:
BinaryHeap(
int capacity=100):array(capacity){
currentSize=0;}
BinaryHeap(
const vector<Comparable> &items)
:array(items.size()+10),
currentSize(items.size())
{
for( int i=0; i<items.size(); ++i)
array[i+1]=items[i];
buildHeap();
}
bool isEmpty() const
{
return currentSize==0;
}
const Comparable &findMin()
const
{
return array[1];
}
void insert( const Comparable &x);
void deleteMin();
// delete minimum from the binaryheap;
void deleteMin( Comparable & minItem);
// delete minimum from the binaryheap, and save the minimum in minItem;
void makeEmpty()
{
array.clear();
}
private:
int currentSize;
// Number of elements in heap
vector<Comparable> array;
// The heap array
void buildHeap()
{
for( int i=currentSize/2; i>0; --i)
percolateDown(i);
}
void percolateDown(
int hole)
{
int child;
Comparable tmp=array[hole];
for(; hole*2<=currentSize; hole=child)
{
child=hole*2;
if( child!=currentSize &&
array[child+1]<array[child])
child++;
if( array[child]<tmp)
array[hole]=array[child];
else break;
}
array[hole]=tmp;
}
};
template<typename Comparable>
void
BinaryHeap<Comparable>::insert(
const Comparable &x)
{
if(
currentSize==array.size()-1)
array.resize(2*array.size());
//Percolate up
int hole=++currentSize;
for(; hole>1 && x<array[hole/2]; hole/=2)
array[hole]=array[hole/2];
array[hole]=x;
}
template<typename Comparable>
void
BinaryHeap<Comparable>::deleteMin()
{
array[1]=array[currentSize--];
percolateDown(1);
}
template<typename Comparable>
void
BinaryHeap<Comparable>::deleteMin( Comparable &minItem)
{
minItem=array[1];
array[1]=array[currentSize--];
percolateDown(1);
}
int main()
{
BinaryHeap<int> H;
for( int i=5; i<40; ++i)
H.insert(i%23);
while( !H.isEmpty())
{
cout<<H.findMin()<<" ";
H.deleteMin();
}
cout<<endl;
return
0;
}
// main.cpp
// Data Structure TRY1
//
// Created by zr9558 on 6/7/13.
// Copyright (c) 2013 zr9558. All rights reserved.
//
// Data Structure C++, Weiss, P.216 Priority Queues (Heaps)
// Here, we do not use array[0], the priority queue is from array[1].
#include<iostream>
using namespace
std;
#include<vector>
#include<list>
#include<algorithm>
template<typename Comparable>
class BinaryHeap
{
public:
BinaryHeap(
int capacity=100):array(capacity){
currentSize=0;}
BinaryHeap(
const vector<Comparable> &items)
:array(items.size()+10),
currentSize(items.size())
{
for( int i=0; i<items.size(); ++i)
array[i+1]=items[i];
buildHeap();
}
bool isEmpty() const
{
return currentSize==0;
}
const Comparable &findMin()
const
{
return array[1];
}
void insert( const Comparable &x);
void deleteMin();
// delete minimum from the binaryheap;
void deleteMin( Comparable & minItem);
// delete minimum from the binaryheap, and save the minimum in minItem;
void makeEmpty()
{
array.clear();
}
private:
int currentSize;
// Number of elements in heap
vector<Comparable> array;
// The heap array
void buildHeap()
{
for( int i=currentSize/2; i>0; --i)
percolateDown(i);
}
void percolateDown(
int hole)
{
int child;
Comparable tmp=array[hole];
for(; hole*2<=currentSize; hole=child)
{
child=hole*2;
if( child!=currentSize &&
array[child+1]<array[child])
child++;
if( array[child]<tmp)
array[hole]=array[child];
else break;
}
array[hole]=tmp;
}
};
template<typename Comparable>
void
BinaryHeap<Comparable>::insert(
const Comparable &x)
{
if(
currentSize==array.size()-1)
array.resize(2*array.size());
//Percolate up
int hole=++currentSize;
for(; hole>1 && x<array[hole/2]; hole/=2)
array[hole]=array[hole/2];
array[hole]=x;
}
template<typename Comparable>
void
BinaryHeap<Comparable>::deleteMin()
{
array[1]=array[currentSize--];
percolateDown(1);
}
template<typename Comparable>
void
BinaryHeap<Comparable>::deleteMin( Comparable &minItem)
{
minItem=array[1];
array[1]=array[currentSize--];
percolateDown(1);
}
int main()
{
BinaryHeap<int> H;
for( int i=5; i<40; ++i)
H.insert(i%23);
while( !H.isEmpty())
{
cout<<H.findMin()<<" ";
H.deleteMin();
}
cout<<endl;
return
0;
}
相关文章推荐
- Data Structures (Weiss) Chapter 6: Leftist Heap
- Data Structures (Weiss) Chapter 4: Binary Search Tree C++
- Data Structures (Weiss) Chapter 7: HeapSort
- Data Structures (Weiss) Chapter 8: Union and Find, Disjoint Sets, union by sizes, C++
- Data Structures (Weiss) Chapter 7: MergeSort
- (转载)左倾堆 (leftist heap):方法参见 Data Structures (Weiss)
- Data Structures (Weiss) Chapter 12: Deterministic Skip Lists (跳跃链表)
- Data Structures (Weiss) Chapter 12: Splay Tree 伸展树
- Data Structures (Weiss) Chapter 7: QuickSort 快速排序
- Data Structures (Weiss) Chapter 5: Separate Chain
- Data Structures (Weiss) Chapter 5: Hash Tables without Linked Lists (quadratic probing)
- Data Structures (Weiss) Chapter 12: Deterministic Skip Lists (跳跃链表,Comparable)
- Data Structures (Weiss) Chapter 12: Treaps
- Data Structures (Weiss) Chapter 3: The Queue ADT, Pointer
- Data Structures (Weiss) Chapter 3: The Queue ADT, Array
- Data Structures (Weiss) Chapter 4: AVL Trees 平衡树
- Data Structures (Weiss) Chapter 6: Binomial Queue
- Data Structures (Weiss) Chapter 3: Vector C++
- Data Structures (Weiss) Chapter 7: Insertion Sort
- 算法学习笔记之——priority queue、heapsort、symbol table、binary search trees