#include <stdio.h>
#include <stdlib.h>
void swap(int *a,int *b);
void adjustdown(int *list,int k,int size);
void HeadSort(int *list,int size);
void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
/*调整堆序列*/
void adjustdown(int *list,int k,int size)
{
int i;
list[0] = list[k];
for(i = 2*k;i <= size;i *= 2)
{
if(i < size && list[i] < list[i+1])i++;//比较选出两个子节点中最大的一个
if(list[0] >= list[i])break;//若子节点都比i小则不继续
else
{
swap(&list[k],&list[i]);//交换父节点和更大的子节点位置
k = i;
}
}
}
/*堆排*/
void HeadSort(int *list,int size)
{
int i,j;
for(i = size/2;i > 0;i--)
adjustdown(list,i,size);//创建最大根堆
printf("创建好的最大根堆:");
for(i = 1;i <= size;i++)
printf("%d%c",list[i]," \n"[i == size]);
for(i = size;i > 1;i--)
{
swap(&list[1],&list[i]);//交换得size-i+1大的数
adjustdown(list,1,i-1);//因为排成堆最大根堆之后swap一次已经取出一个最大值所以i-1
printf("第%d次调整堆:",size-i+1);
for(j = 1;j <= size;j++)
printf("%d%c",list[j]," \n"[j == size]);
}
}
int main(int argc, char const *argv[]) {
int size,*list,i;
printf("请输入数组大小:");
scanf("%d",&size);
list = (int*)malloc(sizeof(int)*(size+1));
printf("请输入%d个元素:\n",size);
for(i = 1;i <= size;i++)
scanf("%d",&list[i]);
HeadSort(list,size);
return 0;
}
//34 76 12 37 89 32 51 74 21 82
王道考研 ++++ 堆排序
最新推荐文章于 2023-12-26 00:00:00 发布