/*****************************
author:yanxuelun
date: 2013-03-26
*****************************/
#include <stdio.h>
typedef enum
{
E_TYPE_HEAP_SORT = 0,
E_TYPE_MAX
};
void AdjustHeap(int* pArray, int iPos, int iNum);
void HeapSort(int* pArray, int iNum);
void InitHeap(int* pArray, int iNum);
void Swap(int* a, int* b);
void Print(int* pArray, int iNum);
void (*pSortFunc[E_TYPE_MAX])(int* pArray, int iNum);
int main()
{
int i = 0;
int iArray[] = {10,23,31,42,56,98,74,88,63,8};
printf("before sort:\n");
Print(iArray, sizeof(iArray)/ sizeof(iArray[0]));
printf("after sort:\n");
pSortFunc[E_TYPE_HEAP_SORT] = HeapSort;
pSortFunc[E_TYPE_HEAP_SORT](iArray, sizeof(iArray)/ sizeof(iArray[0]));
Print(iArray, sizeof(iArray)/ sizeof(iArray[0]));
return 0;
}
/************************
函数名称:Print
函数功能:打印数组元素
入参:pArray -- 数组首地址
iNum -- 数组元素个数
出参: 无
返回: 无
其他: 无
创建时间:2013-03-26
创建人: yanxuelun
*************************/
void Print(int* pArray, int iNum)
{
int i = 0;
if ( NULL == pArray)
{
return;
}
for(i = 0; i < iNum; i++)
{
printf("%d ",pArray[i]);
}
printf("\n");
}
/************************
函数名称:HeapSort
函数功能:堆排序
入参:pArray -- 数组首地址
iNum -- 数组元素个数
出参:pArray -- 数组首地址
返回: 无
其他: 无
创建时间:2013-03-26
创建人: yanxuelun
*************************/
void HeapSort(int* pArray, int iNum)
{
int i = 0;
if ( NULL == pArray)
{
return;
}
// 初始化堆
InitHeap(pArray, iNum);
for( i = iNum - 1; i > 0; i-- )
{
// 交互第一个元素和最后一个元素
Swap(&pArray[0], &pArray[i]);
// 从堆顶开始调整堆
AdjustHeap(pArray, 0, i);
}
}
/************************
函数名称:InitHeap
函数功能:初始化堆
入参:pArray -- 数组首地址
iNum -- 数组元素个数
出参:pArray -- 数组首地址
返回: 无
其他: 无
创建时间:2013-03-26
创建人: yanxuelun
*************************/
void InitHeap(int* pArray, int iNum)
{
int i = 0;
if ( NULL == pArray)
{
return;
}
// 从倒数第二排的最后一个元素开始进行调整(此处画一下完全二叉树的结构更清晰)
for ( i = (iNum - 1)/2; i >= 0; i--)
{
AdjustHeap(pArray,i,iNum);
}
}
/************************
函数名称:AdjustHeap
函数功能:从上向下调整堆
入参:pArray -- 数组首地址
iPos -- 调整堆的起始位置
iNum -- 数组元素个数
出参:pArray -- 数组首地址
返回: 无
其他: 无
创建时间:2013-03-26
创建人: yanxuelun
*************************/
void AdjustHeap(int* pArray, int iPos, int iNum)
{
int temp = pArray[iPos];
int iLeft = 2*iPos + 1;
if ( NULL == pArray)
{
return;
}
while( iLeft < iNum )
{
// 找到当前节点的左右孩子的较小节点
if(pArray[iLeft] < pArray[iLeft+1]
&& iLeft + 1 < iNum )
{
iLeft += 1;
}
// 将当前节点与较小的孩子节点互换元素,同时注意"指针"的指向
if (pArray[iPos] < pArray[iLeft])
{
pArray[iPos] = pArray[iLeft];
iPos = iLeft;
iLeft = 2*iPos + 1;
}
else
{
break;
}
// 填充要调整的元素
pArray[iPos] = temp;
}
}
/************************
函数名称:Swap
函数功能:交互两个数
入参:a -- 第一个元素的指针
b -- 第二个元素的指针
出参:a -- 第一个元素的指针
b -- 第二个元素的指针
返回: 无
其他: 无
创建时间:2013-03-26
创建人: yanxuelun
*************************/
void Swap(int* a, int* b)
{
int temp;
if(NULL ==a || NULL == b)
{
return;
}
temp = *a;
*a = *b;
*b = temp;
}