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

    最大堆和利用堆的性质对数组进行排序。

    HeapFy函数是将节点i为根节点的子树变为最大堆(注意是维护后的i节点作为子树的根节点),length参数为堆得的元素个数

    BuildHeap函数是将长度为length的数组建成一个最大堆。这里对每一个非叶子节点进行HeapFy

    HeapSort对长度为length的数组进行排序(共有length个元素需要排序,下表从1开始)。步骤为先建一个最大堆,然后将堆顶元素与末尾元素互换,然后维护length-1个数的堆,直至堆的长度为1。这里有个关键的地方就是:如果节点的左右两颗子树分别为最大堆,则维护以i为根节点的堆必为最大堆。

    代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    void printArray(int *array,int length){
            int i;
            for(i=1;i<=length;i++){
                    printf("%d ",array[i]);
            }
            printf("\n");
    }
    void HeapFy(int *array,int length,int i){
            int left=i*2,right=i*2+1,large,temp;
            if(left<=length&&array[left]>array[i]){
                    large=left;
            }else{
                    large=i;
            }
            if(right<=length&&array[right]>array[large]){
                    large=right;
            }
            if(large!=i){
                    temp=array[i];
                    array[i]=array[large];
                    array[large]=temp;
                    HeapFy(array,length,large);//recursion
            }
    }
    void BuildHeap(int *array,int length){
            int i;
            for(i=length/2;i>0;i--){
                    HeapFy(array,length,i);
            }               
    }
    void HeapSort(int *array,int length){
            int i;
            int temp;
            BuildHeap(array,length);
            for(i=length;i>1;i--){
                    HeapFy(array,i,1);      
                    temp=array[i];
                    array[i]=array[1];
                    array[1]=temp;
            }
    }
    int main(void){
            int a[]={0,4,111,56,12,57,-3,56,22,2,23};//1 to 10
            printf("before:\n");
            printArray(a,10);
            HeapSort(a,10);
            printf("after:\n");
            printArray(a,10);
            return 0;
    }
  • 相关阅读:
    27. Remove Element
    列表变成字典
    1. Two Sum
    CVPR2019:What and How Well You Performed? A Multitask Learning Approach to Action Quality Assessment
    959. Regions Cut By Slashes
    118. Pascal's Triangle
    loj3117 IOI2017 接线 wiring 题解
    题解 NOI2019 序列
    题解 省选联考2020 组合数问题
    题解 Educational Codeforces Round 90 (Rated for Div. 2) (CF1373)
  • 原文地址:https://www.cnblogs.com/aLittleBitCool/p/2126547.html
Copyright © 2011-2022 走看看