我尝试在gcc和turboc中执行此代码。在GCC中,它在运行时给出了分段错误错误,在turbo中,它在运行时再次给出了空指针赋值错误。
我试过跟踪它,但我不知道问题出在哪里。
#include<stdio.h>
int heapsize;
void heapify(int a[],int i)
{
int l=2*i,r=2*i+1,largest,temp;
if(l<=heapsize && a[l]>a[i])
largest=l;
else
largest=i;
if(r<=heapsize && a[r]>a[largest])
largest=r;
if(largest!=i)
{
temp=a[i];
a[i]=a[largest];
a[largest]=temp;
heapify(a,largest);
}
}
void buildheap(int a[],int length)
{
int i;
heapsize=length;
for(i=length/2;i>=0;i--)
heapify(a,i);
}
void heapsort(int a[],int length)
{
int i,temp;
buildheap(a,length);
for(i=length-1;i>=1;i++)
{
temp=a[0];
a[0]=a[i];
a[i]=temp;
heapsize--;
heapify(a,0);
}
}
void main()
{
int a[20],i,length;
printf("ENTER THE SIZE OF YOUR ARRAY:");
scanf("%d",&length);
printf("ENTER THE ARRAY ELEMENTS: \n");
for(i=0;i<length;i++)
scanf("%d",&a[i]);
heapsort(a,length);
printf("THE SORTED ARRAY IS:");
for(i=0;i<length;i++)
printf("%d /t",a[i]);
}
注意:我使用CLRS中给出的heapsort算法对此进行了编码。
编辑:这是我给出的输入和我得到的错误。
chaitanya @ chaitanya-laptop:〜/ Desktop / My prog $ ./a.out
输入您的阵列大小:5
输入阵列元素:
9
5
8
7
6
分段错误
编辑:显然是i ++的一个愚蠢的错误,而不是i--造成了问题。但是现在似乎存在逻辑错误,因为程序没有将排序的数组作为输出。
输入您的阵列尺寸:5
输入阵列元素:
2
4
3
1
9
被分类的阵列是:3013077 4 1 9 2
答案 0 :(得分:4)
以下for循环永远不会终止。索引不断增加导致数组超出界限,这就是你得到上述错误的原因。
for(i=length-1;i>=1;i++)
{
temp=a[0];
a[0]=a[i];
a[i]=temp;
heapsize--;
heapify(a,0);
}
更新:你的heapify()不正确..试试这个
if(l<heapsize && a[l]>a[i])
largest=l;
else
largest=i;
if(r<heapsize && a[r]>a[largest])
largest=r;
答案 1 :(得分:0)
length
大于20,您肯定会溢出a
heapsort
函数永不终止,因为i
保持增长。你应该改为i--
。printf
输出/t
,而不是标签。将其更改为\t
这些至少应该让你通过段错误,尽管排序看起来仍然不正确。
答案 2 :(得分:0)
在heapsort
函数中,您应该在i--
循环中使用i++
而不是for
。