#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 2000000//测试代码性能的时候用的百万级数组,可以自己调整大小
static int heapsize=SIZE;//具有文件作用域的无外部链接的静态变量,排序函数会用到这个变量,记录堆的大小
int build_max_heap(int *pt);
int max_heapify(int *pt,int i);
int max_heap_sort(int pt[]);
int main(void)
{ //生成、并打印数组
int arr[SIZE];
srand(time(0));//根据系统时间来生成种子
puts("Before Sorting");
for(int i=0;i<SIZE;i++)
{ arr[i]=rand()%SIZE;
printf("%7d",arr[i]);
if((i+1)%10==0)
putchar('\n');
}
//排序、记录时间
float time_start=clock();
max_heap_sort(arr);
float time_end=clock();
//打印排好序的数组
puts("After Sorting");
for(int i=0;i<SIZE;i++)
{
printf("%7d",arr[i]);
if((i+1)%10==0)
putchar('\n');
}
printf("Consume:%fs",(time_end-time_start)/CLOCKS_PER_SEC);
}
int max_heap_sort(int pt[])
{ build_max_heap(pt);
for(int i=SIZE-1;i>=1;i--)
{ int temp=pt[heapsize-1];
pt[i]=pt[0];
pt[0]=temp;
heapsize--;
max_heapify(pt,0);
}
}
int build_max_heap(int *pt)
{ for(int i=(SIZE-1)/2;i>=0;i--)
max_heapify(pt,i);
}
int max_heapify(int *pt,int i)
{ int largest;
int l,r;
int temp=pt[i];
l=2*i+1;
r=2*i+2;
if(l<heapsize&&pt[l]>pt[i])
largest=l;
else
largest=i;
if(r<heapsize &&pt[r]>pt[largest])
largest=r;
if(largest!=i)
{ pt[i]=pt[largest];
pt[largest]=temp;
max_heapify(pt,largest);
}
}