算法导论/6.2保持堆性质

来源:互联网 发布:江西广电网络缴费 编辑:程序博客网 时间:2024/06/05 17:01

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


源代码

/**   算法导论/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);//迭代//具体算法描述参看算法导论p131int 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  RIGHTint 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;}
0 0
原创粉丝点击