最小堆排序

来源:互联网 发布:淘宝怎么优化关键词 编辑:程序博客网 时间:2024/06/05 23:53
#include<stdio.h>const int INF = 0x7fffffff;void exchange(int &a,int &b){    int tmp;    tmp = a;    a = b;    b = tmp;}void heapFrist(int *array,int k,int len){    if(array == NULL || k <=0 || len <= 0)      return;    int left,right;    left = k*2;    right = k*2+1;    if(left<=len){        if(array[k]>array[left]){            exchange(array[k],array[left]);        }        heapFrist(array,left,len);    }    if(right<=len){        if(array[k]>array[right]){            exchange(array[k],array[right]);        }        heapFrist(array,right,len);    }    int fath = k>>1;    if(fath>0&&array[fath]>array[k]){         exchange(array[k],array[fath]);         if(left<=len&&array[k]>array[left]){            exchange(array[k],array[left]);        }        if(right<=len&&array[k]>array[right]){            exchange(array[k],array[right]);        }    }}void print(int *array,int k,int len){    printf("%d ",array[k]);    if(k*2<=len)    print(array,k*2,len);    if(k*2+1<=len)    print(array,k*2+1,len);}void heapScend(int *array,int k,int len){    if(array == NULL || k <=0 || len <= 0)      return;    int left,right;    left = k<<1;    right = k<<1|1;    if(right<=len){        if(array[right]>array[left]){            exchange(array[left],array[k]);            heapScend(array,left,len);        }        else{            exchange(array[right],array[k]);            heapScend(array,right,len);        }    }    else if(left<=len){        exchange(array[left],array[k]);        heapScend(array,left,len);    }}int main(){    int len,array[100];    while(scanf("%d",&len)>0)    {        for(int i=1; i<=len;i++)        {            scanf("%d",&array[i]);        }        heapFrist(array,1,len);        //print(array,1,len);        for(int i = 1; i<=len; i++)        {            printf("%d ",array[1]);            array[1] = INF;            heapScend(array,1,len);        }        printf("\n");    }}

0 0
原创粉丝点击