堆-c++

/**********************************************************************
*版權所有 (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");
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章