📜  优先队列在C中使用数组(1)

📅  最后修改于: 2023-12-03 14:49:32.805000             🧑  作者: Mango

优先队列在C中使用数组

优先队列是一种常见的数据结构,它支持在常数时间内进行插入和删除操作,并且能够在常数时间内返回最大或最小元素。在C语言中,我们可以使用数组来实现优先队列,并且在一些应用场景中,其性能甚至可以超过使用堆的实现。

实现思路

使用数组实现优先队列的基本思路是,将队列中的元素按照优先级排序,对于每个元素,它的优先级都在它前面的元素的优先级之下。具体实现时,我们可以使用一个数组来存储队列中的元素,按照优先级从高到低排序,即数组下标越小的元素优先级越高。每当有新的元素插入时,我们需要将该元素插入到合适的位置,同时将数组中的元素向后移动一个位置。删除操作时,我们将数组中第一个元素删除,将后面的元素向前移动一个位置,并返回被删除的元素。

代码实现

下面是一个用数组实现优先队列的示例代码:

#include <stdio.h>

#define QUEUE_SIZE 10

/* 定义一个结构体来表示队列中的元素 */
typedef struct {
    int value;
    int priority;
} QueueElement;

QueueElement queue[QUEUE_SIZE];
int queue_size = 0;

/* 插入元素时,需要保证元素按照优先级从高到低排序 */
void enqueue(QueueElement element) {
    int i;
    for (i = queue_size - 1; i >= 0; i--) {
        if (queue[i].priority < element.priority) {
            queue[i + 1] = queue[i];
        } else {
            break;
        }
    }
    queue[i + 1] = element;
    queue_size++;
}

/* 删除队首元素时,需要将后面的元素向前移动一个位置 */
QueueElement dequeue() {
    QueueElement element = queue[0];
    int i;
    for (i = 1; i < queue_size; i++) {
        queue[i - 1] = queue[i];
    }
    queue_size--;
    return element;
}

/* 输出队列中的元素 */
void print_queue() {
    int i;
    for (i = 0; i < queue_size; i++) {
        printf("(%d, %d) ", queue[i].value, queue[i].priority);
    }
    printf("\n");
}

int main() {
    /* 将一些元素插入到队列中 */
    enqueue((QueueElement) {1, 1});
    enqueue((QueueElement) {2, 2});
    enqueue((QueueElement) {3, 3});
    enqueue((QueueElement) {4, 4});

    /* 输出队列中的元素 */
    print_queue();

    /* 删除队首元素并输出 */
    QueueElement element = dequeue();
    printf("Dequeue: (%d, %d)\n", element.value, element.priority);

    /* 输出队列中的元素 */
    print_queue();

    return 0;
}
性能比较

使用数组实现优先队列的性能取决于元素数量和插入/删除的操作次数。当元素数量较小时,在大多数情况下,数组实现的性能可以与使用堆的实现相当。但是,随着元素数量的增加,数组实现的效率可能会降低,因为每次插入和删除时都需要移动大量元素。在这种情况下,使用堆实现优先队列可以获得更好的性能。在实际应用中,我们应该结合具体情况选择合适的实现方式。