写得还算认真,本来觉得自己已经懂了,动手的时候才知道细节上好多不清楚。看来以后要多动手了,汗

/*
*   FILE:           heap.c
*   DATA:           2006.7.11
*   AUTHOR:         Liu Qi
*   DESCRIPTION:    heap demo
*/



#include 
"../common/config.h"
#include 
"heap.h"


#define LeftChild(r) ((r) * 2 + 1)


void heapify(ElemType arr[], int heapSize, int root)
{
    
while ( !isLeaf(root, heapSize))    //非叶节点,必有左孩子
    {
        
int maxChild = LeftChild(root);
        
//有右孩子,并且右孩子大于左孩子
        if ( maxChild < heapSize - 1 && arr[maxChild] < arr[maxChild + 1])
                maxChild
++//取右孩子
        
//没有右孩子
        if ( arr[root] >= arr[maxChild] )   //根比孩子大,不用调整
            return;

        swap( 
&arr[root], &arr[maxChild] );
        root 
= maxChild;
    }

}


void MakeHeap(ElemType arr[], int len)
{
    
int i = len / 2 - 1//last node's root

    
for ( ; i >= 0; i--)
    
{
        heapify(arr, len, i);
    }

}

void SortHeap(ElemType arr[], int len)
{
    
int i = len - 1;

    
for ( ; i > 0; i--)
    
{
        swap(
&arr[0], &arr[i]);
        heapify(arr, i, 
0); //调整堆属性
    }

}


BOOL isLeaf(
int root, int len)
{
    
return LeftChild(root) <= len - 1 ? FALSE : TRUE;
}



偶比较懒,想了一会,弄了一个自动化测试的代码:

#include "heap.h"

#define SIZE 5
#define TEST_TIMES 100

int main(void)
{
    
int i = 0;
    ElemType arr[SIZE];

    
for ( ; i < TEST_TIMES; i++)
    
{
        RandArray(arr, ARRAY_LENGTH(arr), 
20);

        MakeHeap(arr, ARRAY_LENGTH(arr));
        SortHeap(arr, ARRAY_LENGTH(arr));
        check_ascending(arr, ARRAY_LENGTH(arr));
        PrintArray(arr, ARRAY_LENGTH(arr), 
"%d ");
    }


    
return EXIT_SUCCESS;
}