您的位置:首页 > 其它

堆排序

2017-03-06 18:06 134 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: