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;
    }
  • 相关阅读:
    Java面试基础 -- Git篇
    Java面试基础
    如何避免死锁?
    如何减少上下文切换?
    Java中的volatile变量有什么作用?
    Thread类中start()方法喝run()方法有什么不同?
    (一)java异常处理的几个问题
    SUSE CaaS Platform 4
    SUSE CaaS Platform 4
    SUSE Ceph 增加节点、减少节点、 删除OSD磁盘等操作
  • 原文地址:https://www.cnblogs.com/aLittleBitCool/p/2126547.html
Copyright © 2011-2022 走看看