zoukankan      html  css  js  c++  java
  • 堆的排序研究

    今天偶然看到一个找出N个数中最大的前500个数,一个不错的解法是使用堆来进行选择,每一次读取一个数判断是否需要放到堆中,这样比较下来就可以找到最大或最小的前500个数了,自己晚上就参考别人的代码写了一个最小堆的结构,后期继续补充。

    View Code
    #include <stdio.h>
    #include <stdlib.h>

    typedef int ElemType;
    struct heap{
    ElemType *num;
    int heapsize;
    int maxSize;
    };

    struct heap HP;
    int init_heap(int size)
    {
    if(size <= 0){
    printf("not allow empty heap\n");
    return -1;
    }
    HP.num = malloc(size*sizeof(ElemType));
    if(HP.num == NULL){
    printf("malloc failed\n");
    exit(1);
    }

    HP.heapsize = 0;
    HP.maxSize = size;
    return 0;
    }

    void exit_heap()
    {
    if(HP.num != NULL){
    free(HP.num);
    HP.num = NULL;
    HP.heapsize = 0;
    HP.maxSize = 0;
    }
    }

    int isEmpty()
    {
    if(HP.heapsize == 0){
    return 1;
    }else{
    return 0;
    }
    }

    int insert_heap(ElemType arg)
    {
    int ct;
    if(HP.heapsize == HP.maxSize){
    ElemType* pe;
    pe = realloc(HP.num,HP.heapsize*2*sizeof(ElemType));
    if(pe == NULL){
    printf("realloc heap failed\n");
    exit(1);
    }
    HP.num = pe;
    HP.maxSize = HP.heapsize*2;
    }
    HP.num[HP.heapsize] = arg;
    HP.heapsize++;

    ct = HP.heapsize - 1;

    while(0 != ct){
    int j = (ct - 1) /2;
    if(arg > HP.num[j]) break;
    HP.num[ct] = HP.num[j];
    ct = j;
    }
    HP.num[ct] = arg;
    return 1;
    }

    ElemType delete_heap()
    {
    ElemType temp,x;
    int i,j;

    if(HP.heapsize == 0){
    printf("heap has been empty\n");
    exit(1);
    }

    x = HP.num[0];
    HP.heapsize--;

    if(HP.heapsize == 0){
    return x;
    }

    temp = HP.num[HP.heapsize];
    i = 0;
    j = 2*i + 1;
    while(j <= HP.heapsize-1){
    if((j< HP.heapsize-1) && (HP.num[j] > HP.num[j+1])){
    j++;
    }
    if(temp <= HP.num[j] ){
    break;
    }

    HP.num[i] = HP.num[j];
    i = j;
    j = 2*i + 1;
    }
    HP.num[i] = temp;
    return x;
    }
    int main()
    {
    int i;
    ElemType it;
    printf("input:");
    for(i=0;i<10;i++){
    scanf("%d",&it);
    insert_heap(it);
    }

    for(i=0;i<10;i++){
    printf("%d ",delete_heap());
    }
    printf("\n");
    return 0;
    }
  • 相关阅读:
    如果你很忙,你一定在什么地方做错了!
    NOSQL介绍
    mysql 8.0.11 安装(windows)
    ORA-28547:(Navicat Premium连接oracle报错)
    线性筛法
    Luogu-P1020(导弹拦截)(DP,LIS ,二分优化)
    POJ
    HDU
    HDU-1024-Max Sum Plus Plus(DP)
    UVA-1625-Color Length(DP LCS变形)
  • 原文地址:https://www.cnblogs.com/gogly/p/2353443.html
Copyright © 2011-2022 走看看