算法导论/6.2保持堆性质

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


源代码

/*
*   算法导论/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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值