为什么这个C实现的heapsort给出了分段错误?

时间:2011-11-19 06:36:54

标签: c segmentation-fault heapsort

我尝试在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

3 个答案:

答案 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