1. 源代码
#include <common.h>
typedef struct _heap_t {
int length; //array length
int size; //heap size
int *data;
} heap_t;
#define PARENT(i) ((i-1)/2)
#define LEFT(i) (2*i + 1)
#define RIGHT(i) (2*i + 2)
//MAX-HEAPIFY
void MAX_HEAPIFY(heap_t *A, int i)
{
int l = LEFT(i);
int r = RIGHT(i);
int largest = 0;
int tmp = 0;
if (l < A->size &&
A->data[l] > A->data[i]) {
largest = l;
} else {
largest = i;
}
if (r < A->size &&
A->data[r] > A->data[largest]) {
largest = r;
}
if (largest != i) {
tmp = A->data[largest];
A->data[largest] = A->data[i];
A->data[i] = tmp;
MAX_HEAPIFY(A, largest);
}
}
//BUILD-MAX-HEAP
void BUILD_MAX_HEAP(heap_t *A)
{
int i = 0;
A->size = A->length;
for (i = (A->length/2 - 1); i >= 0; --i) {
MAX_HEAPIFY(A, i);
}
}
//HEAPSORT
void HEAPSORT(heap_t *A)
{
int i = 0;
int tmp = 0;
BUILD_MAX_HEAP(A);
for (i = (A->length - 1); i >= 1; --i) {
tmp = A->data[0];
A->data[0] = A->data[i];
A->data[i] = tmp;
A->size = A->size - 1;
MAX_HEAPIFY(A, 0);
}
}
void main()
{
int data[] = {5, 3, 17, 10, 84, 19, 7, 22, 9, 9, 20, 88, 10, 19, 23, 100};
heap_t A = {sizeof(data)/sizeof(int), 0, data};
int i = 0;
TRACE("==========第六章 堆排序=========\n");
HEAPSORT(&A);
for (i = 0; i < sizeof(data)/sizeof(int); ++i) {
TRACE("%d\t", data[i]);
}
TRACE("\n");
system("pause");
}
2. 注释
HEAPSORT里的for语句相当于把第一个元素(最大的),最后后面较小的元素互换,换完后第一个元素较小,然后把它降下去。