C + + 이 진 더미 의 실현
3809 단어 데이터 구조
#ifndef __BinaryHeap__
#define __BinaryHeap__
#include <iostream>
class BinaryHeap
{
public:
typedef struct node
{
int startIndex;
int endIndex;
int weight;
} Node;
private:
Node * m_heap;
int m_size;
int m_currentSize;
void m_percolateUp (int index);
void m_percolateDown (int index);
public:
BinaryHeap (int size = 0);
~BinaryHeap (void);
bool isEmpty (void);
bool isFull (void);
bool insert (int startIndex, int endIndex, int weight);
bool deleteMin (Node * const pNode);
};
#endif /* defined(__BinaryHeap__) */
파일 BinaryHeap. cpp 구현
#include "BinaryHeap.h"
// Private methods:
// ---------------------
void BinaryHeap ::m_percolateUp (int index)
{
Node temp = m_heap[index];
size_t i = index;
size_t parent = (i - 1) / 2;
while (i != 0)
{
if (temp.weight < m_heap[parent].weight)
{
m_heap[i] = m_heap[parent];
i = parent;
parent = (i - 1) / 2;
}
else
{
m_heap[i] = temp;
break;
}
}
if (0 == i)
{
m_heap[0] = temp;
}
}
// ---------------------
// ---------------------
void BinaryHeap ::m_percolateDown (int index)
{
Node temp = m_heap[index];
int i = index;
int child = i * 2 + 1;
while (child < m_currentSize)
{
if (child != m_currentSize - 1 && m_heap[child + 1].weight < m_heap[child].weight)
++child;
if (temp.weight > m_heap[child].weight)
{
m_heap[i] = m_heap[child];
i = child;
child = i * 2 + 1;
}
else
{
m_heap[i] = temp;
break;
}
}
if (child >= m_currentSize)
{
m_heap[i] = temp;
}
}
// ---------------------
// Public methods:
// ---------------------
BinaryHeap ::BinaryHeap (int size)
{
if (size <= 0)
{
std ::cerr << "Wrong size." << std ::endl;
return;
}
m_heap = new Node[size];
if (NULL == m_heap)
{
std ::cerr << "Out of space." << std ::endl;
return;
}
m_size = size;
m_currentSize = 0;
}
// ---------------------
// ---------------------
BinaryHeap ::~BinaryHeap (void)
{
delete []m_heap;
}
// ---------------------
// ---------------------
bool BinaryHeap ::isEmpty (void)
{
if (0 == m_currentSize)
return true;
else
return false;
}
// ---------------------
// ---------------------
bool BinaryHeap ::isFull (void)
{
if (m_currentSize == m_size)
return true;
else
return false;
}
// ---------------------
// ---------------------
bool BinaryHeap ::insert (int startIndex, int endIndex, int weight)
{
if (isFull())
{
std ::cerr << "Heap is full already." << std ::endl;
return false;
}
if (startIndex >= m_size || startIndex < 0 ||
endIndex >= m_size || endIndex < 0)
{
std ::cerr << "Wrong start index or end index." << std ::endl;
return false;
}
m_heap[m_currentSize].startIndex = startIndex;
m_heap[m_currentSize].endIndex = endIndex;
m_heap[m_currentSize].weight = weight;
m_percolateUp(m_currentSize);
++m_currentSize;
return true;
}
// ---------------------
// ---------------------
bool BinaryHeap ::deleteMin (Node * const pNode)
{
if (isEmpty())
{
std ::cerr << "Heap is empty already." << std ::endl;
return false;
}
*pNode = m_heap[0];
m_heap[0] = m_heap[--m_currentSize];
m_percolateDown(0);
return true;
}
// ---------------------
다음으로 이동:http://blog.csdn.net/golden_shadow/article/details/6730500
참고:http://blog.csdn.net/listeningsea/article/details/7718484
http://blog.chinaunix.net/uid-20937170-id-3331263.html
http://en.wikipedia.org/wiki/Binary_heap
http://baike.baidu.com/link?url=325xU5U7MrGN46ESO3LqK7tJ-6mtB3EqAyyxHnyKo8vl8qX8xzTKWp73oqwTHHT5
http://blog.csdn.net/morewindows/article/details/6976468
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.