#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个元素:1 2. 3. 5. 4. 分段故障(核心转储)

发现我在实现MID变量时犯了一个错误. 正确的答案是:

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;

C++相关问答推荐

函数指针始终为零,但在解除引用和调用时有效

理解没有返回语句的递归C函数的行为

为什么在Linux(特别是Ubuntu 20.04LTS)上,POSIX共享内存对象在重启后仍然存在,然后突然变成了根用户?

ZED for SDL上的C语言服务器

识别和处理c中整数溢出的最佳方法?

Rust FFI--如何用给出返回引用的迭代器包装C风格的迭代器?

为什么GDB/MI进程的FIFO循环中有read()阻塞

判断X宏的空性

如何使用libgpio(d)为Raspberry Pi编译C程序?

按长度对argv中的单词进行排序

Fprintf正在写入多个 struct 成员,并且数据过剩

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

C中的char**v*char[]

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

为什么孤儿进程在 Linux 中没有被 PID 1 采用,就像我读过的一本书中声称的那样?

中位数和众数不正确

System V 消息队列由于某种原因定期重置

使用共享变量同步多线程 C 中的函数

如何确保 gcc + libc 对于多字节字符串使用 UTF-8,对于 wchar_t 使用 UTF-32?

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?