我用 C 编写了这个合并排序程序。它显示了实现数组后的"Segmentation fault (core dumped)"


#include <stdio.h>
void mergesort();
void merge();
int main()
{
int a[40], n;
printf("nEnter the number of elements:");
scanf("%d", &n);
printf("nEnter the %d elements:", n);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
mergesort(a, 0, n - 1);
printf("nThe Sorted array is: ");
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
return 0;
}
void mergesort(int a[], int first, int last)
{
int mid;
if (first < last)
{
mid = (mid + last) / 2;
mergesort(a, first, mid);
mergesort(a, mid + 1, last);
merge(a, first, mid, last);
}
}
void merge(int a[], int first, int mid, int last)
{
int b[50];
int i, j, k;
i = first;
j = mid + 1;
k = first;
while (i <= mid && j <= last)
{
if (a[i] <= a[j])
b[k++] = a[i++];
else
b[k++] = a[j++];
}
if (i > mid)
{
while (j <= last)
b[k++] = a[j++];
}
else
{
while (i <= mid)
b[k++] = a[i++];
}
for (i = first; i <= last; i++)
a[i] = b[i];
}

我已经用C编写了这个合并排序程序;分段故障(堆芯倾倒(";在实现阵列之后。我不知道问题出在哪里。所以请帮帮我,我第二天要考试。我得到这样的输出

输入元素数量:5

输入5个元素:12.3.5.4.分段故障(堆芯转储(

发现我在实现mid-variable时犯了一个错误。正确的是:

mid=(first+last)/2;

谢谢大家的帮助。你的每一个回复都有助于识别错误。

由于在未初始化时读取mid,程序具有未定义的行为:

void mergesort(int a[], int first, int last) {
int mid;
if (first < last) {
mid = (mid + last) / 2;
//             ^^^

你可能想要:

mid = (first + last) / 2;
void mergesort(int a[],int first,int last)
{
int mid;
if(first<last)
{
mid=(mid+last)/2;
mergesort(a,first,mid);
mergesort(a,mid+1,last);
merge(a,first,mid,last);
}
}

当第一次运行时,mid不保证为0或任何其他数字;mid是一个每次都可能变化的整数。因此,您得到的数字可能远远超出数组的界限。初始化mid到0会解决这个问题,但正如我上面的答案所指出的,你实际上想做mid = (first + last) / 2

相关内容

最新更新