我正在尝试用C语言实现heapsort程序。 当我尝试打印排序的数组时,整个程序一直工作到最后一部分。 排序结束时,我无法访问结构的任何元素。 请帮我解决错误。
程序如下 // programe实现堆排序
#include<stdio.h>
#include<stdlib.h>
struct MaxHeap
{
int size;
int* array;
};
void print_array(int arr[],int size)
{
int i;
printf("Entered print_array function\n");
for(i=0;i<size;i++)
printf("%d ",arr[i]);
printf("\n");
}
void swap(int *p, int *q)
{
int temp=*p;
*p=*q;
*q=temp;
}
void heapify(struct MaxHeap* maxheap,int x)
{
if(maxheap->array[x] < maxheap->array[(2*x + 1)] && (2*x + 1) < maxheap->size)
swap(&(maxheap->array[x]),&(maxheap->array[(2*x + 1)]));
if(maxheap->array[x] < maxheap->array[(2*x + 2)] && (2*x + 2) < maxheap->size)
swap(&(maxheap->array[x]),&(maxheap->array[(2*x + 2)]));
}
struct MaxHeap* create_maxheap(int arr[],int size)
{
struct MaxHeap* maxheap = (struct MaxHeap*)malloc(sizeof(struct MaxHeap));
maxheap->size = size;
maxheap->array =arr;
int i;
for(i=(maxheap->size-1)/2;i>=0;i--)
heapify(maxheap,i);
return maxheap;
}
void heap_sort(struct MaxHeap* maxheap)
{
int i;
while(maxheap->size>0)
{
swap(&(maxheap->array[0]),&(maxheap->array[maxheap->size]));
maxheap->size--;
// printf("maxheap->size is %d\n",maxheap->size);
heapify(maxheap,0);
}
}
void main()
{
int tmp[] = {3,1,3};
int size = 3;
struct MaxHeap* maxheap=create_maxheap(tmp,size);
printf("The MaxHeap is created with size %d\n",maxheap->size);
heap_sort(maxheap);
printf("The array after sorting is \n");
print_array(maxheap->array,size);
}
输出如下
The MaxHeap is created with size 3
maxheap->size is 2
maxheap->size is 1
maxheap->size is 0
The array after sorting is
Segmentation fault
答案 0 :(得分:0)
优秀的评论告诉您如何修复您的计划
以下是可能出现的问题
main()中有几个堆栈变量。这些将在堆栈上或多或少地连续布局。其中一个是阵列, 其中一条评论表明代码正试图访问这些元素 出界。
数组只有3个整数,代码尝试写入第4个元素 (即3的索引),它可能最终改变大小变量。注意 我使用'may'而不是'will',因为取决于编译器选项等, 它可以是一些其他变量,甚至是未使用的填充空间。这个无效 下次使用该变量时,将注意到变量的更新。
数组越界写入的问题是问题及其影响 可能是完全不相关的代码,导致调试它的人感到悲伤,并且 为几乎三分之一的c / c ++程序员提供就业机会。
我建议打印'size'的值来测试我的假设!
现在如果尺寸确实腐败,而且非常高,那么下一个问题是 为什么屏幕上不打印至少3个值。答案就在那里 printf写入的FILE结构(stdout是FIFO *)确实如此 缓冲,仅在内部缓冲区已满时写入OS。要调试 这些问题,在每个printf()之后放了一个fflush(stdout)。
答案 1 :(得分:0)
全心全意,
我发现错误在交换功能中 交换(及(maxheap-&GT;阵列[0]),及(maxheap-&GT;阵列[maxheap-&GT;大小]));
应该是 swap(&amp;(maxheap-&gt; array [0]),&amp;(maxheap-&gt; array [maxheap-&gt; size - 1]));
这解决了这个问题。