c语言优先队列的实现

优先队列即二叉堆,实现如下:

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

typedef int Element;
#define MAX_BINHEAP_LENGTH 10

struct BinaryHeap {
    Element array[MAX_BINHEAP_LENGTH];
    int length;
};

int compare(const void* a, const void* b)
{
    // minimul
    return *(int*)a - *(int*)b;
    // maximul
    // return *(int*)b - *(int*)a;
}

void percolateDown(struct BinaryHeap* heap, int hole)
{
    int child;
    Element temp = heap->array[hole];

    for (; hole * 2 <= heap->length; hole = child) {
        child = hole * 2;
        if (child != heap->length && compare(&(heap->array[child + 1]), &(heap->array[child])) < 0) {
            child++;
        }
        if (compare(&(heap->array[child]), &temp) < 0) {
            heap->array[hole] = heap->array[child];
        } else {
            break;
        }
    }
    heap->array[hole] = temp;
}

void buildBinaryHeap(struct BinaryHeap* heap, Element* array, int length)
{
    if (array == NULL || length == 0) {
        memset(heap, 0, sizeof(struct BinaryHeap));
        return;
    }

    for (int i = 0; i < length; i++) {
        heap->array[i] = array[i];
        heap->length = length;
    }

    for (int i = heap->length / 2; i > 0; i--) {
        percolateDown(heap, i);
    }
}

int isEmpty(struct BinaryHeap* heap)
{
    return heap->length == 0;
}

void insert(struct BinaryHeap* heap, Element elem)
{
    int hole = ++(heap->length);
    for (; hole > 1 && compare(&elem, &(heap->array[hole / 2])) < 0; hole /= 2) {
        heap->array[hole] = heap->array[hole / 2];
    }
    heap->array[hole] = elem;
}

// here is deleteMinimul, if deleteMaximul, change it!
void deleteMinimul(struct BinaryHeap* heap)
{
    if (heap->length == 0) {
        return;
    }
    heap->array[1] = heap->array[heap->length--];
    percolateDown(heap, 1);
}

// here is deleteMinimul, if deleteMaximul, change it!
Element getMinimul(struct BinaryHeap* heap)
{
    return heap->array[1];
}

int main()
{
    int array[8] = { 0, -13, 5, 23, -9, -2, 4, -6 };
    struct BinaryHeap heap;
    buildBinaryHeap(&heap, array, 8);
    while (!isEmpty(&heap)) {
        Element elem = getMinimul(&heap);
        deleteMinimul(&heap);
        printf("%d\n", elem);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/tongyishu/p/12222540.html

时间: 2024-08-28 09:00:08

c语言优先队列的实现的相关文章

优先队列C语言实现

优先队列利用堆实现,堆的实现在前面已经说过了,优先队列的一个重要的操作是: 1.  heap_max  O(1) 2. heap_extract_max  O(lgn) 3. heap_increase_key  O(lgn) 4, heap_insert  O(lgn) 下面是C语言实现 #define MIN -100000 int heap_max(struct heap *h) { return h->arr[1]; } int heap_extract_max(struct heap

【C语言】zz优先队列的实现

做一个题目时,看见解法中使用了优先队列,http://hawstein.com/posts/3.6.html . 颇为好奇,找资料学习了一下,顺便做个摘要. c++的用法: 转自:http://blog.chinaunix.net/uid-21712186-id-1818266.html #include <iostream>#include <vector>#include <queue>#include <stdio.h>#include <fun

深入浅出数据结构C语言版(15)——优先队列(堆)

在普通队列中,元素出队的顺序是由元素入队时间决定的,也就是谁先入队,谁先出队.但是有时候我们希望有这样的一个队列:谁先入队不重要,重要的是谁的"优先级高",优先级越高越先出队.这样的数据结构我们称之为优先队列(priority queue),其常用于一些特殊应用,比如操作系统控制进程的调度程序. 那么,优先队列该如何实现呢?我们可以很快给出三种解决方案. 1.使用链表,插入操作选择直接插入到表头,时间复杂度为O(1),出队操作则遍历整个表,找到优先级最高者,返回并删除该结点,时间复杂度

优先队列(堆) -数据结构(C语言实现)

数据结构与算法分析 优先队列 模型 Insert(插入) == Enqueue(入队) DeleteMin(删除最小者) == Dequeue(出队) 基本实现 简单链表:在表头插入,并遍历该链表以删除最小元 时间代价昂贵 二叉查找树 二叉查找树支持许多不需要的操作,实现麻烦,不值得 最合适:二叉堆 二叉堆 堆的两种性质 结构性 完全二叉树:除底层外完全填满,底层也是从左至右填 完全二叉树的高为 log N 分布很有规律可以用数组实现 左儿子 = 2i 右儿子 = 2i + 1 堆序性 树的最小

战胜C语言中令人头疼的问题

C语言一共32个关键字,下面一一列出:   1.auto声明自动变量 在默认情况下,编译器默认所有变量都是auto 2.int声明整型变量 3.double声明双精度变量 4.long声明长整型变量 5.char声明字符型变量 6.float声明浮点型变量 7.short声明短整型变量 8.signed声明有符号类型变量 9.unsigned声明无符号类型变量 最高位如果是1,表明这个数是负数,其值为除最高位以外的剩余位的值添上这个“-”号: 如果最高位是0,表明这个数是正数,其值为除最高位以外

浅谈C++ STL中的优先队列(priority_queue)

从我以前的博文能看出来,我是一个队列爱好者,很多并不是一定需要用队列实现的算法我也会采用队列实现,主要是由于队列和人的直觉思维的一致性导致的. 今天讲一讲优先队列(priority_queue),实际上,它的本质就是一个heap,我从STL中扒出了它的实现代码,大家可以参考一下. 首先函数在头文件<queue>中,归属于命名空间std,使用的时候需要注意. 队列有两种常用的声明方式: std::priority_queue<T> pq; std::priority_queue<

数据结构算法[c语言]

共16章,共四部分:基础知识,数据结构,排序和搜索. 所有的实现都是使用C语言缩写.任何语言都有优缺点,选用C语言是因为它使用的广泛. 第一章: 导论 第二章: 算法分析原理 第三章: 基本数据结构 第四章: 抽象数据 第五章: 递归和数 第六章: 基本排序方法 第七章: 快速排序 第八章: 归并和归并排序 第九章: 优先队列和堆排序 第十章: 基数排序 第十一章: 特殊目的的排序方法 第十二章: 符号表和二叉搜索树 第十三章: 平衡树 第十四章: 哈希方法 第十五章: 基数搜索 第十六章: 外

《数据结构与算法分析—C语言描述》pdf

下载地址:网盘下载 内容简介 编辑 <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行时间分析的基础上考查了一些高级数据结构,从历史的角度和近年的进展对数据结构的活跃领域进行了简要的概括.由于<数据结构与算法分析:C语言描述(原书第2版)>选材新颖,方法实用,题例丰富,取舍得当.<数据结构与算法分析:C语言描述(原书第2版)>的目的是培养学生良好的程序设计技巧和熟练的算

基于二叉树的优先队列

简介 优先队列:指队列中的元素都被指派一个优先级,元素按优先级最大(最小)出队,存储堆的数组的第一个元素就是最大的(或最小的).所以用堆作为优先队列的元素载体是合适的. 队列有两个基本操作:1.入队2.出队. 队列的特点是先进先出.通常都把队列比喻成排队买东西,大家都很守秩序,先排队的人就先买东西.但是优先队列有所不同,它不遵循先进先出的规则,而是根据队列中元素的优先权,优先权最大的先被取出.通常把优先队列比喻成现实生活中的打印.一个打印店里有很多打印机,每台机器的性能不一样,有的打印机打印很快