本文实现了堆排序算法,它在最小生成树以及最短路径算法中都有应用。

堆是一种简单的数据结构它满足一个基本的性质,将堆对应于一个二叉树,那么该树中每一个节点都比它的左子树的key值大,而比它的右子树的key值小.

对于基本类型的堆,一般用数组实现就可以.

下图中是从《算法导论(第二版)》中摘抄的一个例子

堆排序的时间复杂度为O(nlgn).

有关代码的更多内容可以参考算法导论第二版.

我这里有算法导论第二版英文版的电子书,需要的可以给我留言

 

代码
#include<stdio.h>
#include
<stdlib.h>
#include
<math.h>
#include
<time.h>
#define MAX 100
int size;
int MAX_Heapify(int A[],int i)
{
 
int l,r,largest;
 
//size = sizeof(A)/sizeof(int);
 l = i*2+1;
 r 
= i*2 + 2;
 
if(l < size && A[l] > A[i])
  largest 
= l;
 
else
  largest 
= i;
 
if(r < size && A[r] > A[largest])
  largest 
= r;
 
if(largest != i)
 {
  
int tmp = A[i];
  A[i] 
= A[largest];
  A[largest] 
= tmp;
  MAX_Heapify(A,largest);
 }
 
return 0;
}
int build_heap(int A[])
{
 
int i;
 
//size = sizeof(A)/sizeof(int);
 for(i = (size-1)/2;i>=0;i--)
  MAX_Heapify(A,i);
 
return 0;
}
int heap_sort(int A[])
{
 
int i,tmp;
 
//size = sizeof(A)/sizeof(int);
 build_heap(A);
 
for(i = size-1;i>0;i--)
 {
  tmp 
= A[0];
  A[
0= A[i];
  A[i]
=tmp;
  size
--;
  MAX_Heapify(A,
0);
 }
 
return 0;
}
int print_heap(int a[])
{
 
int i,ov = 0;
 
for(i = 0;;i++)
 {
  
int k = (int)pow(2,i),j;
  
for(j = 0;j<k;j++)
  {
   
if((k+j)<size)
   {
    printf(
"%d\t",a[k+j]);
   }
   
else
   {
    ov 
= 1;
    
break;
   }
  }
  
if(ov )
  {
   
break;
  }
 }
 
return 0 ;
}
int test()
{
 
int a[MAX],i;
 srand((
int)time(0));
 
for(i = 0;i<MAX;i++)
 {
  a[i] 
= rand();
  printf(
"%d\t",a[i]);
 }
 size 
= sizeof(a)/sizeof(int);
 printf(
"\n\nresult:\n");
 
 heap_sort(a);
 
//print_heap(a);
 size = sizeof(a)/sizeof(int);
 
for(i=0;i<MAX;i++)
  printf(
"%d\t",a[i]);
 
return 0;
}
int main()
{
 test();
 
return 0;
}