C语言 优先级队列 大根堆的板子

优先级队列是啥呢?

简单来说 就是一个数组长度为k   

往里面放一个元素, 依然能按照从小打到的距离排序

代码逻辑就是这样:

while(k > 0){
        int temp = 0;
        if(nums[numsSize-1]%3 > 0){
            temp = 1;
        }
        nums[numsSize-1] /= 3;
        nums[numsSize-1] += temp;
        int topnum = nums[numsSize-1];
        int top = numsSize-2;
        while(top >= 0 && nums[top] > topnum){
            nums[top+1] = nums[top];
            top--;
        }
        nums[top+1] = topnum;
        k--; 
    }

但这样写,复杂度会很大(俩while),因此出现了一个非常牛逼的算法----大根堆

void swap(int* nums,int i,int j){
    int temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
}

void down(int* nums,int size,int i){
    for(int k = 2*i +1;k<size;k=2*k+1){
        //父节点(k-1)/2, 左节点k,右节点k+1
        if(k + 1 < size && nums[k] < nums[k+1]){
            k++;
        }
        if(nums[k] < nums[(k-1)/2]){
            break;
        }
        swap(nums,k,(k-1)/2);
    }
}

void Init(int *nums, int size) {
    for (int i = size / 2 - 1; i >= 0; i--) {
        down(nums, size, i);
    }
}

void Push(int *nums, int size, int x) {
    nums[size] = x;
    for (int i = size; i > 0 && nums[(i - 1) / 2] < nums[i]; i = (i - 1) / 2) {
        swap(nums, i, (i - 1) / 2);
    }
}

int Pop(int *nums, int size) {
    swap(nums, 0, size - 1);
    down(nums, size - 1, 0);
    return nums[size - 1];
}

板子如上所示:其实思想很简单,down就是对一个数组的排序,利用树的结点思想来进行排序。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值