zoukankan      html  css  js  c++  java
  • 堆,优先队列,堆排序, 大顶堆

    #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) {
            return !q->cnt;
    }
    
    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(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("
    "); for (int i = 1; i <= MAX_N; i++) printf(" %d ", p->data[i]);printf("
    ");
            for (int i = 1; i <= MAX_N; i++) printf(" %d,", top(p)), pop(p);
    #undef MAX_N
            clear(p);
            printf("
    ");
            return 0;
    }
    
    
  • 相关阅读:
    关于vs的网站发布
    gaga...
    将gridView中的数据导出 并保存到excel中
    ASP.NET 2.0 Treeview Checkboxes Check All Javascript
    写一个自动编号的存储过程
    获取一个部门的所有下级部门
    相同则写入组合
    jquery html form
    repeater合并单元格
    VS2010 快捷键大全
  • 原文地址:https://www.cnblogs.com/hhhahh/p/15110827.html
Copyright © 2011-2022 走看看