zoukankan      html  css  js  c++  java
  • 堆排序

    最大堆排序算法:

    View Code
    #include<stdio.h>
    #include<stdlib.h>
    
    #define LEFT(i) i*2+1
    #define RIGHT(i) i*2+2
    #define PARENT(i) floor((i-1)/2)
    
    typedef int DataType;
    /*
       局部特性:对节点i,考察它的子树,将其子树下面的最大值换到该节点上来。
    */
    void max_heapify(DataType A[],int i,int length)
    {
        int l,r;
        int large;
        l = LEFT(i);
        r = RIGHT(i);
        if( (l < length) && (A[l] > A[i])){
            large = l;
        }else{
            large = i;
        }
    
        if( (r < length) && (A[r] > A[large])){
            large = r;
        }
        if(large != i){
            DataType tmp;
            tmp = A[i];
            A[i] = A[large];
            A[large] = tmp;
            max_heapify(A,large,length);
        }
    
    
    }
    /*
    构建大堆结构,对于叶子节点,无需进行调整,所以只需调整中间节点。而中间节点的范围是再0-PATENT(length)直接。
    */
    void build_max_heap(DataType A[],int length)
    {
        int i;
        for(i=PARENT(length);i>=0;i--){
            max_heapify(A,i,length);
        }
    }
    /*
    堆排序,由于0元素再建堆之后,肯定是最大的。所以将其摘到数组最后,将叶子调到堆中。然后对0元素做堆出来,找到最大的那个,再摘到数组中
    这样循环,直到堆中的最后一个元素。这里可以看出来,其实这样做的冗余度挺大的。因为如果堆高度很高,而每一次摘除之后,找到最大的那个元素
    需要做很多递归调用。因为需要改进尽快找到那个最大的元素。
    */
    void heapsnort(DataType A[],int length)
    {
        int i;
        build_max_heap(A,length);
        for(i=length-1;i>0;i--){
            DataType tmp;
            tmp = A[0];
            A[0] = A[i];
            A[i] = tmp;
            max_heapify(A,0,i);
        }
    }
    int main()
    {
        int i;
        int length;
        DataType A[10]={4,1,3,2,16,9,10,14,8,7};
        printf("sizeof = %d\n",sizeof(A)/sizeof(DataType));
        length = sizeof(A)/sizeof(DataType);
        //max_heapify(A,1,length);
        //build_max_heap(A,length);
        heapsnort(A,length);
        for(i=0;i<10;i++){
            printf("%d ",A[i]);
        }
        printf("\n");
        return 0;
    }
  • 相关阅读:
    yun2win-iOS端IM SDK使用方法
    题解
    普通乘法,加法等时间复杂度计算
    noip2014 解方程(本博文转载于http://blog.csdn.net/popoqqq/article/details/40984859,略有删减)
    检查
    关于对拍 (来自老胡)
    2014 NOIP 赛前自我整理提醒。
    USACO 2014 JAN 滑雪录像
    Vue 双向绑定原理
    Vue 路由
  • 原文地址:https://www.cnblogs.com/gogly/p/2748822.html
Copyright © 2011-2022 走看看