heapsort/minheap/maxheap/堆排序/最大堆/最小堆

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void exchange(int *array,int i1,int i2)
{
        if(array[i1]!=array[i2])
        {
                array[i1]=array[i1]^array[i2];
                array[i2]=array[i1]^array[i2];
                array[i1]=array[i1]^array[i2];
        }
}

void maxheapify(int *array,int len,int i)
{
        int left=2*i+1;
        int right=2*i+2;
        int largest;
        largest=i;
        if((left<len)&&(array[left]>array[largest]))
        {
                largest=left;
        }
        if((right<len)&&(array[right]>array[largest]))
        {
                largest=right;
        }
        if(largest!=i)
        {
                exchange(array,largest,i);
                maxheapify(array,len,largest);
        }
}

void minheapify(int *array,int len,int i)
{
        int left=2*i+1;
        int right=2*i+2;
        int smallest;
        smallest=i;
        if((left<len)&&(array[left]<array[smallest]))
        {
                smallest=left;
        }
        if((right<len)&&(array[right]<array[smallest]))
        {
                smallest=right;
        }
        if(smallest!=i)
        {
                exchange(array,i,smallest);
                minheapify(array,len,smallest);
        }
}

void buildmaxheap(int *array,int len)
{
        int i;
        for(i=(len-2)/2;i>=0;i--)
        {
                maxheapify(array,len,i);
        }
}

void buildminheap(int *array,int len)
{
        int i;
        for(i=(len-2)/2;i>=0;i--)
        {
                minheapify(array,len,i);
        }
}

void maxknum(int *array,int len,int data)
{
        if(data>array[0])
        {
                array[0]=data;
        }
        minheapify(array,len,0);
}

void printheap(int *array,int len)
{
        int i;
        for(i=0;i<len;i++)
        {
                printf("%d ",array[i]);
        }
        printf("\n");
}

void heapsort(int *array,int len)
{
        buildmaxheap(array,len);
        int i;
        printf("heapsort:");
        for(i=len-1;i>=0;i--)
        {
                printf("%d ",array[0]);
                array[0]=array[i];
                maxheapify(array,i,0);
        }
        printf("\n");
}

int main(int argc,char *argv[])
{
        FILE *fp_input=fopen("heapsort.dat","r");
        FILE *fp_ouput=stdout;

        int k;
        int num;
        int data;
        int *array;
        int *original;

        fscanf(fp_input,"%d",&k);
        array=(int *)malloc(k*sizeof(int));
        original=(int *)malloc(k*sizeof(int));

        int i;
        for(i=0;i<k;i++)
        {
                fscanf(fp_input,"%d",array+i);
        }

        memcpy(original,array,k*sizeof(int));


        printf("the original data is:");
        printheap(array,k);

        buildmaxheap(array,k);
        printf("after build max heap is:");
        printheap(array,k);

        buildminheap(array,k);
        printf("after build min heap is:");
        printheap(array,k);

        fscanf(fp_input,"%d",&data);
        while(!feof(fp_input))
        {
                maxknum(array,k,data);
                fscanf(fp_input,"%d",&data);
        }
        printf("max k num is:");
        printheap(array,k);

        heapsort(original,k);

        free(array);
        free(original);
        fclose(fp_input);
        return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章