堆排序—源码

来源:互联网 发布:苏州知行电子有限公司 编辑:程序博客网 时间:2024/05/16 09:24
// Heapsort_ 堆排序cpp : 定义控制台应用程序的入口点。
//
/*
       堆排序
*/

#include "stdafx.h"

/********* 用宏定义的形式求节点 i的子节点和父节点 ***********/
#define LEFT ( i) (2* i +1)
#define RIGHT ( i) (2* i +2)
#define PARENT ( i) (( i +1)/2-1)

/********* 交换数值,形参为引用 **********/
void swap ( int & a int & b)
{
       int t = a;
       a =b ;
       b =t ;
}

/******** 以某个点为子树的根节点,找出此子树中的最大值,并放到根节点处,且其子树也满足此结构 *********/
void HeapAdjust ( int * src int startint len )
{
       if (NULL == src && len <1)
      {
             printf ("the dada input is wrong \n" );
             return ;
      }
       int nl = LEFT( start );
       int nr = RIGHT( start );
       int temp =0;
       if (src [ start] < src [nl ] && nl< len )
             temp =nl ;
       else
             temp =start ;

       if (src [ temp] < src [nr ] && nr< len )
             temp =nr ;
       if (temp != start)
      {
             swap (src [ start], src [temp ]);
             HeapAdjust (src templen );
      }

}

/******* 建立大顶堆 ******************/
void BuildBigHeap ( int * src int len)
{
      
       for (int i= PARENT (len -1); i>=0; i --)
      {
             HeapAdjust (src ilen );
      }
}

/************** 排序 *********************/
void HeapSort ( int * src int len)
{
       BuildBigHeap (src len);
       for (int i= len -1; i >=0; i--)
      {
             swap (src [0], src[ i ]);
             HeapAdjust (src , 0, i);
      }
}

/************ 输出********************/
void Printsrc ( int * src int len)
{
       for (int i=0; i <len i++)
      {
             printf ("%d\t" src[ i ]);

      }

}

int _tmain ( int argc _TCHAR argv[])
{

       int src []={3,5,64,23,12,656,21,67,122,90,43,12};
       int len = sizeof( src )/4;
       HeapSort (src len);
       Printsrc (src , len);

       getchar ();
       return 0;
}
  

结果:
     
0 0
原创粉丝点击