关于堆排序的问题,如何解决?

我刚学了堆排序但是出不来正确结果,请问这是什么原因啊,代码如下

#include<stdio.h> 
 void sift ( int r[ ], int k, int m )
{//要筛选结点的编号为k,堆中最后一个结点的编号为m 
   int i,j,temp;
   i=k;  j=2*i;  temp=r[i];  //将筛选记录暂存
    while (j<=m )           //筛选还没有进行到叶子
    {
        if (j<m && r[j]<r[j+1]) j++;  //左右孩子中取较大者
        if (r[i]>r[j]) break; 
        else {
             r[i]=r[j];   i=j;   j=2*i;
        }
     }
     r[i]=temp;   //将筛选记录移到正确位置
}
/*swap()函数的作用是将a[i]和a[j]互换*/
void swap(int a[], int i, int j) 
{ 
  int temp; 
  temp=a[i]; 
  a[i]=a[j]; 
  a[j]=temp; 
} 
void  HeapSort ( int  r[], int n)
{
    for (int i=n/2; i>=1; i--)      //初建堆
       sift(r, i, n) ;  

    printf("第1次建堆后的结果是: ");
    for(int i=1;i<=n;i++) printf("%d ",r[i]);
    printf("\n\n");
    int c=2;

    for (int i=1; i<n; i++ )
    {
        swap(r,1,n-i+1);           //移走堆顶
       sift(r, 1, n-i);               //重建堆
       printf("第%d次建堆后的结果是: ",c++);

       for(int j=1;j<=n-i;j++)printf("%d ",r[j]);
       printf("\n\n");


     }
}
  
int main(void) 
{ 
  int i; 
  int a[10]={0, 13,38,27,49,76,65,49,97}; //保证结点编号从1开始
  printf("排序前:"); 
  for(i=1;i<=8;i++) 
  { 
    printf("%d ",a[i]); 
  } 
  printf("\n\n");
  HeapSort(a, 8); 
  printf("排序后:"); 
  for(i=1;i<=8;i++) 
  { 
    printf("%d ",a[i]); 
  } 
  printf("\n\n"); 
  return 0; 
} 

img

望采纳!!点击该回答右侧的“采纳”按钮即可采纳!!
你的代码中似乎并没有明显的语法错误。不过,有几点可以注意:

在输出每次建堆后的结果时,应该使用循环变量 j 而不是 i。

在输出排序后的数组时,应该使用 for 循环,而不是 while 循环。

在主函数 main 中,应该将数组 a 的第一个元素初始化为 0,而不是 1。因为数组 a 从下标 1 开始存储数据。

在 HeapSort 函数中,应该将 for (int i=1; i<n; i++ ) 中的 i<n 改为 i<=n。因为数组 a 的最后一个元素的下标是 n,不包含在排序范围内。

在 HeapSort 函数中,应该将 swap(r,1,n-i+1); 中的 n-i+1 改为 n-i。因为交换的是数组 a 的末尾元素和堆顶元素,末尾元素的下标为 n-i。


#include<stdio.h>

void sift ( int r[ ], int k, int m )
{//要筛选结点的编号为k,堆中最后一个结点的编号为m
int i,j,temp;
i=k; j=2i; temp=r[i]; //将筛选记录暂存
while (j<=m ) //筛选还没有进行到叶子
{
if (j<m && r[j]<r[j+1]) j++; //左右孩子中取较大者
if (r[i]>r[j]) break;
else {
r[i]=r[j]; i=j; j=2i;
}
}
r[i]=temp; //将筛选记录移到正确位置
}

/swap()函数的作用是将a[i]和a[j]互换/
void swap(int a[], int i, int j)
{
int temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}  

void HeapSort ( int r[], int n)
{
for (int i=n/2; i>=1; i--) //初建堆
sift(r, i, n) ;


printf("第1次建堆后的结果是: ");
for(int i=1;i<=n;i++) printf("%d ",r[i]);
printf("\n\n");
int c=2;

for (int i=1; i<=n; i++ )
{
    swap(r,1,n-i+1);           //移走堆顶
   sift(r, 1, n-i);               //重建堆
   printf("第%d次建堆后的结果是: ",c++);

   for(int j=1;j<=n-i;j++) printf("%d ",r[j]);
   printf("\n\n");


 }
}

int main(void)
{
int i;
int a[10]={0, 13,38,27,49,76,65,49,97}; //保证结点编号从1开始
printf("排序前:");
for(i=1;i<=8;i++)
{
printf("%d ",a[i]);
}
printf("\n\n");
HeapSort(a, 8);
printf("排序后:");
for(i=1;i<=8;i++)
{
printf("%d ",a[i]);
}
printf("\n\n");
return 0;
}