数据结构篇 - 优先级队列(堆) (记得做题噢~)

本文介绍了如何使用堆数据结构来实现优先级队列,包括堆的定义、数组表示、最小堆的性质及其基本操作,如创建、插入和删除。随后提到的应用场景包括任务调度器和常见的算法问题解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,思考一种实现优先级队列的方式

①建立一个链表, 在表头以O(1)的复杂度插入操作,然后遍历该链表删除最小元O(N)

②建立一个链表, 每次插完进行排序, 然后delete 最小元

当然用二叉查找树也可以

今天介绍一种时间复杂度较低的手法----堆

堆是一颗完全被填满的二叉树. 只有在底层的时候从左到右没填满.

同时这样的树也被称为完全二叉树.

2.树这种数据结构在数组中应该如何表示呢?

ABCDEFGHIJK
0123456789101112

①对于数组任意 i 位置的元素, 左儿子在 2i   ,右儿子在2i + 1

3,堆的性质及基本操作

堆的每个节点都小于等于他的两个儿子,这也的堆叫做最小堆

①优先级队列的声明

struct HeapStruct{
    int capacity;
    int size;
    int* nums;
}

Heapstruct  HeapCreate(int max){
    Heapstruct h = malloc(sizeof(Heapstruct));
    h->nums = malloc(sizeof(int)*(max + 1));
    h->capacity = max;
    h->size = 0;
}

②insert demo

void Insert(Heapstruct h, int val){
    if(h->size == h->capacity){
        return;
    }
    for(int i = ++h->size; h->nums[i/2] > val;i /= 2){
        h->nums[i] = h->nums[i/2];
    }     
    h->nums[i] = val;
}

③delete demo

int DeleteMin(Heapstrcut h){
    if(h->size == 0){
        return -1;
    }
    minval = h->nums[1];
    lastval = h->nums[h->size--];
    int i;
    for(i = 1;i*2 <= h->size;i = child){
        child = i * 2;
        if(child != h->size && h->nums[child] > h->nums[child + 1]){
            child++;
        }
        if(lastval > h->nums[child]){
            h->nums[i] = h->nums[child];
        }
    }
    h->nums[i] = lastval;
    return minval;
}

至此为止,基本的堆操作已经学会了,开始愉快的做题吧~

1,任务调度器

2,前k个高频元素

3,数组第K个最大元素

4,合并K个升序链表

5,滑动窗口最大值

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值