您的位置:首页 > 其它

算法导论/6.2保持堆性质

2015-09-10 21:42 441 查看

保持堆性质的递归与迭代源程序

源代码

/*
*   算法导论/6.2保持堆性质的实现
*   2015.9.10 by Bean
*
*/

#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);//迭代

//具体算法描述参看算法导论p131
int MAX_HEAPIFY(int a[], int i, int* )//数组从1开始
{
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)
{
//      int t = *a + *b;
//      *a = t - *a;
//      *b = t - *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, (int*)0);
MAX_HEAPIFY(a, 2, (char*)0);
for (int i = 0; i <= heap_size(a); i++)
printf("%d ", a[i]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: