ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

堆,优先队列,堆排序

2021-08-07 01:04:18  阅读:137  来源: 互联网

标签:Priority 优先 return 队列 堆排序 queue int ind data


#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define swape(a, b) ({\
                __typeof(a) temp = a;\
                a = b; b = temp;\
                })

typedef struct priority_queue {
        int *data, cnt, size;
} Priority_queue;

Priority_queue *init(int n) {
        Priority_queue *p = (Priority_queue *)malloc(sizeof(Priority_queue));
        p->data = (int *)malloc(sizeof(int) * (n + 1));
        p->cnt = 0; p->size = n;
        return p;
}

void clear(Priority_queue *p) {
        if (!p) return ;
        free(p->data);
        free(p);
        return ;
}

int empty(Priority_queue *p) {
        if (!p->cnt) return 1;
        return 0;
}

int top(Priority_queue *p) {
        return p->data[1];
}

int push(Priority_queue *p, int n) {
        if(!p || p->cnt > p->size) return 0;
        p->data[++p->cnt] = n;
        int ind = p->cnt;
        while(ind > 1 && n > p->data[ind >> 1]) {
                swape(p->data[ind >> 1], p->data[ind]);
                ind >>= 1;
        }
        return 1;
}

int pop(Priority_queue *p) {
        if(!p || empty(p)) return 0;
        p->data[1] = p->data[p->cnt--];
        int ind = 1, key = 1;
        while(p->cnt > ind && ind << 1 < p->cnt) {
                p->data[ind << 1] > p->data[ind] && (key = ind << 1);
                p->cnt > key && p->data[key] < p->data[ind << 1 | 1] && (key = ind << 1 | 1);
                if (ind == key) break;
                swape(p->data[ind], p->data[key]);
                ind = key;
        }
        return 1;
}

int main() {
        int k;
        srand(time(0));
#define MAX_N 20
        Priority_queue *p = init(MAX_N);
        for (int i = 1; i <= MAX_N; i++) k = rand() % 100, printf(" %d,", k), push(p, k);
        printf("\n"); for (int i = 1; i <= MAX_N; i++) printf(" %d ", p->data[i]);printf("\n");
        for (int i = 1; i <= MAX_N; i++) printf(" %d,", top(p)), pop(p);
#undef MAX_N
        clear(p);
        printf("\n");
        return 0;
}

标签:Priority,优先,return,队列,堆排序,queue,int,ind,data
来源: https://www.cnblogs.com/hhhahh/p/15110827.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有