#include <stdio.h>
#define LARGE 1 // 构建大堆,大堆排序后是 从小到大
#define SMALL 0 // 构建小堆,小堆排序后是 从大到小
#define LEN 11
#define RLEN 10
int arr[LEN]; // arr[0] 不使用,坐标从1开始
void adjust(int *arr,int s,int len)
{
int tmp,j;
tmp = arr[s];
for(j=2*s; j<=len; j*=2)
{
#if SMALL
if(j<len && arr[j] < arr[j+1]) // 构建大堆
j++;
if(!(tmp < arr[j]))
break;
#else
if(j<len && arr[j] > arr[j+1]) // 构建小堆
j++;
if(!(tmp > arr[j]))
break;
#endif
arr[s] = arr[j];
s = j;
}
arr[s] = tmp;
}
void heapsort(int *arr,int len)
{
int i,tmp;
for(i=len/2; i>0; i--)
{
adjust(arr,i,len);
}
for(i=len; i>1; --i)
{
tmp = arr[1];
arr[1] = arr[i];
arr[i] = tmp;
adjust(arr,1,i-1);
}
}
int main(void)
{
int i;
for(i=1;i<LEN;i++)
{
scanf("%d",arr+i);
}
heapsort(arr,RLEN);
putchar('\n');
for(i=1;i<LEN;i++)
{
printf("%3d",arr[i]);
}
putchar('\n');
return 0;
}
堆排序
最新推荐文章于 2024-09-04 23:05:17 发布