堆排序

/*****************************
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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值