/**********************************************************************
*版權所有 (C)2014, cy。
*
*文件名稱:堆.cpp
*內容摘要:無
*其它說明:無
*當前版本: V1.0
*作 者:cheng yang
*完成日期: 20140624
*
* 版本 修改時間 修改人 修改內容
********************************************************************
* V1.0 20140624 cy 創建
**********************************************************************/
#include <iostream>
using namespace std;
//字段最大長度
const int MAXSIZE = 10000;
int a[MAXSIZE] = {0};
int heapsize = 0;
//函數聲明
inline void swap(int i , int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
//獲得i節點的父親節點下標
inline int Parent(int i)
{
return i >> 1;
}
//左孩子節點的下標
inline int Left(int i)
{
return i << 1;
}
//右孩子節點的下標
inline int Right(int i)
{
return (i << 1) + 1;
}
/**********************************************************************
*功能描述:保持堆的性質
*輸入參數:數組a[]的下標
*輸出參數:無
*返回值:無
*其它說明:無
*修改日期 版本號 修改人 修改內容
* --------------------------------------------------------------
*
***********************************************************************/
void MaxHeapify(int i)
{
int left = Left(i);
int right= Right(i);
int largest = 0;
if (left <= heapsize && a[left] > a[i])
{
largest = left;
}
else
{
largest = i;
}
if (right <= heapsize && a[right] > a[largest])
{
largest = right;
}
if (largest != i)
{
swap(i, largest);
MaxHeapify(largest);
}
}
/**********************************************************************
*功能描述:建堆
*輸入參數:指向全局數組的指正 arr*
堆的大小 n
*輸出參數:無
*返回值:無
*其它說明:無
*修改日期 版本號 修改人 修改內容
* --------------------------------------------------------------
*
***********************************************************************/
void BuildHeapify(int *arr, const int n)
{
heapsize = n;
for (int i = heapsize / 2; i >= 0; i--)
{
MaxHeapify(i);
}
}
/****************************************************************
*功能描述: 主函數 *
*輸入參數: 無 *
*輸出參數: 無 *
*返回值 :無 *
*其他說明: 無 *
*修改日期 版本號 修改人 修改內容
* -------------------------------------------------------------------------------
*
****************************************************************/
int main()
{
int i = 0;
while (cin >> a[i++])//爲什麼i會比實際輸入的多出2個,輸入3個數(a[0]--a[2]),可i=4;??
BuildHeapify(a, i-2);
for (int j =i-2 ; j >= 0; j--)
{
cout << a[0] << endl;
swap(0, j);
heapsize--;
MaxHeapify(0);
}
system("pause");
}
堆-c++
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.