我的堆排序 错了 不知哪里 帮我改一下

来源:百度知道 编辑:UC知道 时间:2024/07/03 02:46:44
/*heapsort*/
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
int a[1000];
int n;

void heap(int d ,int m)//维护堆
{
int min,flag,temp;
while(flag)
{
flag=0;
min=a[d];
if(d*2<=m&&a[d*2]<min)
{
min=a[d*2];
flag=d*2;
}
if(d*2+1<=m&&a[d*2+1]<min)
{
min=a[d*2+1];
flag=d*2+1;
}
temp=a[d];a[d]=min/*a[flag]*/;a[flag]=temp;d=flag;
}
}

void buildheap()
{
for(int i=n/2;i>=1;i--) heap(i,n);//从下到上保证有序地建立初始堆
}

int main()
{
int i,temp;
printf("Please enter the number(<999) of the number is

维护堆的时候你的flag没有初始化,是否进入while循环是不可测的
在while之前给flag随便赋一个非0值保证进入循环就行了

另外,没看懂你为什么要用极小堆把数组排成倒序的,然后又倒序输出,纯属多此一举。直接用极大堆就可以了

/*heapsort*/
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
int a[1000];
int n;

void heap(int d ,int m)//维护堆
{
int min,flag=1,temp;
while(flag)
{
flag=0;
min=a[d];
if(d*2<=m&&a[d*2]<min)
{
min=a[d*2];
flag=d*2;
}
if(d*2+1<=m&&a[d*2+1]<min)
{
min=a[d*2+1];
flag=d*2+1;
}
if (flag)
{temp=a[d];a[d]=min/*a[flag]*/;a[flag]=temp;d=flag; }
}
}

void buildheap()
{
int i;
for(i=n/2;i>=1;i--) heap(i,n);//从下到上保证有序地建立初始堆
}

int main()
{
int i,temp;
printf("Please enter the number(<999) of the number is to be sorted.\n");
scanf("%d",&n);
printf("Please