c++実装優先キュー


ゆうせんキュー
優先キューは、コンピュータ科学における抽象データ型です.優先キューの各要素にはそれぞれ優先度があり、優先度が最も高い要素が最初にサービスを受けます.優先度が同じ要素は、優先キュー内の順序でサービスされます.優先キューは往々にしてスタックで実現される.
典型的な実装は,性能の観点から優先キューがスタックで実現され,O(log n)の時間的複雑度を有する挿入要素性能,O(n)の初期化構造の時間的複雑度を有する.自己平衡二叉を用いてツリーを検索すると,挿入と削除の時間的複雑度はO(log n),二叉ツリーを構築する時間的複雑度はO(n log n)である.計算の複雑さの観点から,優先キューはソートアルゴリズムに等価である.
コード例(詳細はコードコメントを参照)
#include 
using namespace std;

class PriorityQueue
{
private:
	int* pArray;
	int m_length;
public:
	PriorityQueue(int N) {
		//          1     
		pArray = new int[N + 1];
		m_length = 0;
	}

	int delMax() {
		//            
		int max = pArray[1];
		//                ,      ,        
		swap(pArray[1], pArray[m_length--]);
		//       
		pArray[m_length + 1] = NULL;
		//          
		sink(1);
		//         
		return max;

	}

	void insert(int v) {
		//   v   pArray[1]   ,        ++
		pArray[++m_length] = v;
		//         
		swim(m_length);
	}

	//       
	bool isEmpty() {
		return m_length == 0;
	}

	int size() {
		return m_length;
	}

	//    
	void swim(int k) {
		//                           
		while (k > 1 && pArray[k] > pArray[k / 2]) {
			//          
			swap(pArray[k / 2], pArray[k]);
			// k         
			k /= 2;
		}
	}

	//    
	void sink(int k) {
		while (2 * k <= m_length)
		{
			//           k      2*k j
			int j = 2 * k;
			//                ,                  
			if (j < m_length && (pArray[j] < pArray[j + 1])) j++;
			//                      ,       
			if (pArray[k] > pArray[j]) break;
			//              
			swap(pArray[k], pArray[j]);
			// k       
			k = j;
		}
	}
};

int main() {
	PriorityQueue pq(5);
	pq.insert(2);
	pq.insert(11);
	pq.insert(6);
	pq.insert(1);
	pq.insert(15);

	cout << pq.delMax() << endl;
	cout << pq.delMax() << endl;
	cout << pq.delMax() << endl;
	cout << pq.delMax() << endl;
	cout << pq.delMax() << endl;
	return 0;
}

参照先:https://zh.wikipedia.org/wiki/%E5%84%AA%E5%85%88%E4%BD%87%E5%88%97アルゴリズム第4版p 202