我只是在C堆陣列。但運行時,它給我分段錯誤(核心轉儲)...我不知道我在哪裏試圖訪問未分配的內存!分段故障,而heapifying
#include<stdio.h>
int n;
int left(i)
{
return (2*i);
}
int right(i)
{
return (2*i + 1);
}
void min_heap(int a[],int i)
{
int l=left(i);
int r=right(i);
int min;
if((l<=n)&&(a[l]<=a[i])&&(a[l]<=a[r]))
{
min=a[l];
a[i]=a[i]+a[l];
a[l]=a[i]-a[l];
a[i]=a[i]-a[l];
}
else if((r<=n)&&(a[r]<=a[i])&&(a[r]<=a[l]))
{
min=a[r];
a[i]=a[i]+a[r];
a[r]=a[i]-a[r];
a[i]=a[i]-a[r];
}
min_heap(a,min);
}
int main()
{
printf("The no is : ");
scanf("%d",&n);
int i,a[n+1];
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=n/2;i>=1;i--)
{
min_heap(a,i);
}
for(i=1;i<=n;i++)
{
printf("%d",a[i]);
}
return 0;
}
不適用於任何關於! – haccks
我不清楚'if'和'else'塊中的計算應該做什麼;它看起來不像一個簡單的交換。你檢查'l <= n',但是如果'l == n',那麼'r> n',當你訪問'a [r]'時你會遇到問題。如果你的數組的大小是10('n == 10'),並且數組中的值是1000000以上,那麼你使用'min = a [l];'或'min = a [r];'表示你將在一個應該比實際大得多的數組上進行遞歸。有一個全局變量'n'是俗套的;將它作爲參數傳遞給函數。 –
@JonathanLeffler:那些交換(但不是直截了當的)。我建議將它們改爲使用臨時的舊式掉期。特別是因爲'min'已經在那裏作爲臨時的了。 –