保持堆性质的递归与迭代源程序
源代码
#include <stdio.h>
/**
* LEFT - 求左子节点的序号
* @parent 父节点的序号
*/
int LEFT(int parent);
/**
* RIGHT - 求左子节点的序号
* @parent 父节点的序号
*/
int RIGHT(int parent);
/**
* heap_size - 求堆的大小,为数组的第一个数
* @a 数组的指针
*/
int heap_size(int a[]);
/**
* exchange - 原地交换数值
* @a && @b 数值
*/
int exchange(int* a, int* b);
/**
* print - 打印数组
* @a 数组指针
*/
int print(int a[]);
extern int printf(char*...);
int MAX_HEAPIFY(int a[], int i, int* = 0);
void MAX_HEAPIFY(int a[], int i, char* = 0);
int MAX_HEAPIFY(int a[], int i, int* )
{
int l = LEFT(i);
int r = RIGHT(i);
int heapSize = heap_size(a);
int largest = -1;
if (l <= heapSize && a[l] > a[i])
largest = l;
else
largest = i;
if (r <= heapSize && a[r] > a[largest])
largest = r;
if (largest != i)
exchange(&a[i], &a[largest]) && MAX_HEAPIFY(a, largest, (int*)0);
return true;
}
#define PARENT(i) ((i - 1) / 2)
#define LEFT(i) (i << 1)
#define RIGHT(i) ((i << 1) + 1)
void MAX_HEAPIFY(int a[], int i, char*)
{
int l = LEFT(i);
int r = RIGHT(i);
int heapSize = heap_size(a);
int largest = -1;
int flag = true;
while (flag && (l <= heapSize || r <= heapSize))
{
if (l <= heapSize && a[l] > a[i])
largest = l;
else
largest = i;
if (r <= heapSize && a[r] > a[largest])
largest = r;
if (largest != i)
exchange(&a[i], &a[largest]);
else
flag = false;
}
}
#undef PARENT
#undef LEFT
#undef RIGHT
int LEFT(int i)
{
return i << 1;
}
int RIGHT(int i)
{
return (i << 1) + 1;
}
int heap_size(int a[])
{
return a[0];
}
int exchange(int* a, int* b)
{
if ( *a != *b)
{
*a ^= *b ^= *a ^= *b;
}
return true;
}
int main()
{
int a[] = {10, 16, 4, 10, 14, 7, 9, 3, 2, 8, 1};
MAX_HEAPIFY(a, 2, (char*)0);
for (int i = 0; i <= heap_size(a); i++)
printf("%d ", a[i]);
return 0;
}