根据算法导论实现:
#include <stdlib.h>
#include <string.h>
int parent(int i)
{
return (i/2);
}
int left(int i)
{
return 2*i;
}
int right(int i)
{
return 2*i+1;
}
#define MAX_SIZE 100
struct heap
{
int data[MAX_SIZE];
int length;
int heap_size;
};
void max_heapify(struct heap * h, int i)
{
int l = left(i);
int r = right(i);
int largest = i;
if(l <= h->heap_size && h->data[l] > h->data[i])
{
largest = l;
}
if(r <= h->heap_size && h->data[r] > h->data[largest])
{
largest = r;
}
if(largest != i)
{
int tmp = h->data[largest];
h->data[largest] = h->data[i];
h->data[i] = tmp;
max_heapify(h, largest);
}
}
void build_max_heap(struct heap *h)
{
h->heap_size = h->length;
int start = h->length / 2;
while(start >= 1)
{
max_heapify(h, start);
start--;
}
}
void heap_sort(struct heap *h)
{
build_max_heap(h);
while (h->heap_size > 1)
{
int tmp = h->data[h->heap_size];
h->data[h->heap_size] = h->data[1];
h->data[1] = tmp;
h->heap_size--;
max_heapify(h, 1);
}
}
int main(int argc, char **argv)
{
struct heap h;
memset(&h, 0, sizeof(h));
h.length = 50;
int i = 1;
while (i <= h.length)
{
h.data[i] = random() % 1000;
i++;
}
heap_sort(&h);
return 0;
}