C++STL之二叉堆

b36g 9年前發布 | 2K 次閱讀 C/C++

// myBinaryHeap.cpp : 定義控制臺應用程序的入口點。
//

include "stdafx.h"

include <vector>

include <iostream>

define random(x) (rand()%x)

using namespace std;

template <typename T> class BinaryHeap { private: int currentSize; vector<T> vecArray; void buildHeap() //將序列建堆的過程 { for (int i = currentSize/2 ; i >= 0; i--) { perColateDown(i); } }; void perColateDown(int hole); public: explicit BinaryHeap(int capacity = 100){currentSize = capacity;} explicit BinaryHeap (const vector<T>& items):vecArray(items.size() + 10), currentSize(items.size()) //------vecArray(items.size() + 10) { for (int i = 0; i < items.size() ; i++) { vecArray[i] = items[i]; } buildHeap(); }

bool isEmpty() const
{
    return  0== currentSize;
};
const T& findMin() const
{
    return vecArray[0];
}
const vector<T> getVector()
{
    return vecArray;
}

void insert(const T& x);
void deleteMin();
void deleteMin(T& minItem);
void makeEmpty();

};

template <typename T> void BinaryHeap<T>::insert(const T& x) { if (currentSize == vecArray.size() - 1) { vecArray.resize(vecArray.size() * 2); } int hole = ++ currentSize; //建立一個空穴,即數組的一個下標 for (; hole > 1 && x< vecArray[hole/2]; hole << 1) { vecArray[hole] = vecArray[hole/2]; } vecArray[hole] = x; }

template <typename T> void BinaryHeap<T>::deleteMin() { if (isEmpty()){ return;} vecArray[1] = vecArray[currentSize --]; perColateDown(1); } template <typename T> void BinaryHeap<T>::deleteMin(T& minItem) { if (isEmpty()){ return;} minItem = vecArray[1] ; vecArray[1] = vecArray[currentSize --]; perColateDown(1); }

template <typename T> void BinaryHeap<T>::perColateDown(int hole) //向下計算當前數的實際位置 { int child ; T temp = vecArray[hole]; for(; hole2 < currentSize; hole = child) { child = hole 2; if (child != currentSize && vecArray[child+1] < vecArray[child]) // 若左子樹大于右子樹 child ++; if (vecArray[child] < temp) // 左子樹和右子樹的最小值和節點值比較,將最小值壓入節點,繼續尋找適合節點值的位置 vecArray[hole] = vecArray[child]; else break; } vecArray[hole] = temp; }

int _tmain(int argc, _TCHAR* argv[]) { vector<int> vecInt; for (int i = 0; i < 10; i++) { vecInt.push_back(random(51)); cout << vecInt[i] <<" "; }

cout  <<endl;
BinaryHeap<int>* bh =new BinaryHeap<int>(vecInt) ;
for (int i=0; i < 10; i++)    
{
    cout << bh->getVector()[i] <<" ";   //這里等于實現了堆排序算法
}
return 0;

}</pre>

 本文由用戶 b36g 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!