#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;
}
heapsort/minheap/maxheap/堆排序/最大堆/最小堆
最新推荐文章于 2022-10-24 21:59:34 发布