堆与堆排序

最大堆排序算法详解

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

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;
}

转载于:https://www.cnblogs.com/aLittleBitCool/archive/2011/08/03/2126547.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值