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;
    }
  • 相关阅读:
    List 集合的常用方法总结
    springboot 整合 web 项目找不到 jsp 文件
    Web 安全
    微服务开放平台接口设计
    SpringCloud Hystrix 参数
    SpringCloud Eureka 配置
    ELK 日志收集系统
    网盘搜索引擎原理
    jsPlumb.jsAPI阅读笔记(官方文档翻译)
    ionic获取ios唯一设备id的解决方案
  • 原文地址:https://www.cnblogs.com/gogly/p/2748822.html
Copyright © 2011-2022 走看看