浙大数据结构习题笔记:最小堆的建立

最小堆的建立

最小堆的建立有两种方式的插入
一种是逐次插入的时候排序成完全二叉树,代码比较简单。
另一种是借助堆排序的方法,先输入所有的节点,再通过类似于堆的删除操作的方式,从存在子节点的节点开始反向排序,将所有的节点捋顺。

具体代码实现

#include <iostream>
#include <malloc.h>

const int MinData = -100000;
const int MaxSize = 1005;

using namespace std;

typedef struct HeapStruct *Heap;
struct HeapStruct{
    int *data;//数组
    int size;//当前元素个数
    int capacity;//最大容量
};

Heap create()
{
    Heap H;
    H = (Heap)malloc(sizeof(struct HeapStruct));
    H->data = (int*)malloc(sizeof(int)*(MaxSize +1));
    H->size = 0;
    H->capacity = MaxSize;
    H->data[0] = MinData;
    return H;
}

void Insert(Heap H,int x)
{
    H->size++;
    int i = H->size;
    for(; H->data[i/2]>x ;i/=2){
        H->data[i] = H->data[i/2];
    }
    H->data[i] = x;
}

void sort(Heap H,int i)
{
    int child,parent;
    int temp = H->data[i];
    for(parent = i;parent*2 <= H->size;parent = child){
        child = 2*parent;
        if((child != H->size)&&(H->data[child+1] < H->data[child]))
            child++;
        if(H->data[child] >= temp)
            break;
        else
            H->data[parent] = H->data[child];
    }
    H->data[parent] = temp;
}

void adjust(Heap H)
{
    int i = H->size/2;//i为最后一个有孩子的节点
    for(;i>0;i--){
        //每个有孩子的节点为根,堆排序
        sort(H,i);
    }
}

void circle(Heap H)
{
    for(int i=1;i<=H->size ;i++){
        cout<<H->data[i]<<" ";
    }
}

int main()
{
    Heap H,I;
    H = create();
    I = create();
    //插入法
    Insert(H,9);
    Insert(H,22);
    Insert(H,33);
    Insert(H,41);
    Insert(H,52);
    Insert(H,64);
    circle(H);
    printf("\n");
    //排序法
    I->data[1] = 33;
    I->data[2] = 9;
    I->data[3] = 22;
    I->data[4] = 64;
    I->data[5] = 52;
    I->data[6] = 41;
    I->size = 6;
    adjust(I);
    circle(I);
    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值