您好,登錄后才能下訂單哦!
/** @file HeapSort.h
* @copyright personal
* @brief 優(yōu)先級隊(duì)列及堆排序
* @version V1.0.0
* @author fangyuan
* @date 2015/12/31
* @note 測試版本
*/
#include "iostream"
using namespace std;
template<class T>
class CPriQueue
{
private:
int m_iIndex;
int m_iMaxsize;
T* m_pArray;
void swap(int i ,int j)
{
T t;
t = m_pArray[i];
m_pArray[i] = m_pArray[j];
m_pArray[j] = t;
}
void siftup()
{
int p;
for(int i = m_iIndex; i > 1 && m_pArray[p=i/2] > m_pArray[i]; i = p)
{
swap(p,i);
}
}
void siftdown()
{
int c;
for(int i = 1; (c=2*i) <= m_iIndex; i = c)//循環(huán)條件,有左結(jié)點(diǎn)
{
if(c+1 <= m_iIndex && m_pArray[c+1] < m_pArray[c])//右結(jié)點(diǎn)存在,且值比左結(jié)點(diǎn)小
{
c++;
}
if(m_pArray[i] <= m_pArray[c]) //當(dāng)前結(jié)點(diǎn)值不大于左結(jié)點(diǎn)值,跳出循環(huán)
{
break;
}
swap(c,i);
}
}
public:
CPriQueue(int m)
{
m_iMaxsize = m;
m_pArray = new T[m_iMaxsize+1];
m_iIndex = 0;
}
void insert(T t)
{
if(m_iIndex >= m_iMaxsize)
{
cout << "堆大小超過最大值" << endl;
return;
}
m_pArray[++m_iIndex] = t;
siftup();//保持堆性質(zhì)
}
T extract()
{
T value;
if(m_iIndex < 1)
{
cout << "此堆為空" << endl;
}
else
{
value = m_pArray[1];
m_pArray[1] = m_pArray[m_iIndex--];
siftdown();
}
return value;
}
//在原空間上進(jìn)行排序,只使用一個單位額外空間
void heapSort()
{
int n = m_iIndex;//為了重用siftdown()
while(m_iIndex > 1)
{
swap(1,m_iIndex--);
siftdown();
}
m_iIndex = n;
}
void print()
{
for(int i = 1; i <= m_iIndex; ++i)
{
cout << m_pArray[i] << "\t";
}
cout << endl;
}
};
//優(yōu)先級隊(duì)列及堆排序測試
void priqueueTest()
{
CPriQueue<int> cp(100);
int value;
cout << "請輸入需要插入堆的整數(shù)" << endl;
while(cin>>value)
{
cp.insert(value);
}
cp.print();
cout << cp.extract() << endl;
cp.print();
cp.heapSort();
cp.print();
}
int main()
{
//優(yōu)先級隊(duì)列
priqueueTest();
system("pause");
return 0;
}
//不足之處,歡迎指正。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。