我刚学了堆排序但是出不来正确结果,请问这是什么原因啊,代码如下
#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;
}
望采纳!!点击该回答右侧的“采纳”按钮即可采纳!!
你的代码中似乎并没有明显的语法错误。不过,有几点可以注意:
在输出每次建堆后的结果时,应该使用循环变量 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;
}