在 C 中的数组中合并排序算法 - .exe 不是 运行?

Merge sort algorithm in an array in C - .exe not running?

以下是我的 'C' MergeSort 算法代码。我正在使用 Dev C++,使用 TDM:GCC 编译器。不给出编译错误,但编译后 exe 不 运行。请帮忙。

#include<stdio.h>
#include<conio.h>

int main()
{
    int A[] = {12, 5, 6, 78, 223, 1, 45, 34, 78, 99};
    int n = sizeof(A);
    int i = 0;

    A[n] = MergeSort(A[n], n);

    for ( i = 0; i < n; i++ ) printf("%d\n", A[i]);

    return 0;
}

int MergeSort(int A[], int n)
{
    int mid = n/2;
    int left[mid], right[n - mid];
    int i;

    if(n<2) return;

    for ( i = 0; i < mid; i++ )
        left[i] = A[i];
    for ( i = mid; i < n; i++ )
        right[i] = A[i];

    int nL = sizeof(left);
    int nR = sizeof(right);

    MergeSort(left, nL);
    MergeSort(right, nR);
    Merge(left, right, nL, nR, mid);
}

int Merge(int left[], int right[], int nL, int nR, int mid)
{
    int n = nL + nR;
    int i, j, k = 0;
    int A[n];

    for ( k = 0; k < n; k++ )
    {
        if( left[i] <= right[mid + j] )
        {
            A[k] = left[i];
            i = i + 1;
        }
        else
        {
            A[k] = right[mid + j];
            j = j + 1;
        }

        if ( i + j >= n) break;
    }

    return;
}

我的代码根本没有 运行,并立即显示错误 window。

------ 编辑 ------

我新编辑的代码如下。现在没有错误,但仍然没有进行排序。

#include<stdio.h>
#include<conio.h>

int Merge(int left[], int right[], int nL, int nR, int A[])
{
    int n = nL + nR;
    int i = 0;
    int j = 0;
    int k = 0;

    for ( k = 0; k < n; k++ )
    {
        if(i < nL && j < nR && left[i] <= right[j] )
        {
            A[k] = left[i];
            i = i + 1;
        }
        else
        {
            A[k] = right[j];
            j = j + 1;
        }
    }

    return;
}

void MergeSort(int A[], int n)
{
    int mid = n/2;
    int left[mid], right[n - mid];
    int i;

    if(n<=1) return;

    for ( i = 0; i < mid; i++ )
        left[i] = A[i];
    for ( i = 0; i < n - mid; i++ )
        right[i] = A[i + mid];

    int nL = sizeof(left)/sizeof(left[0]);
    int nR = sizeof(right)/sizeof(right[0]);

    MergeSort(left, nL);
    MergeSort(right, nR);
    Merge(left, right, nL, nR, A);
}

int main()
{
    int A[] = {98, 5, 6, 78, 223, 1, 45, 34, 78, 99};
    int n = sizeof(A)/sizeof(A[0]);
    int i = 0;

    MergeSort(A, n);

    for ( i = 0; i < n; i++ ) printf( "%d\n", A[i] );

    return 0;
}

--- 最新编辑 ---

新代码在 Merge 中进行了修改,其工作方式如下:

#include<stdio.h>
#include<conio.h>

int Merge(int left[], int right[], int nL, int nR, int A[])
{
    int n = nL + nR;
    int i = 0;
    int j = 0;
    int k = 0;

    for ( k = 0; k < n; k++ )
    {
        if(j >= nR || (i < nL && left[i] <= right[j]))
        {
            A[k] = left[i];
            i = i + 1;
        }
        else
        {
            A[k] = right[j];
            j = j + 1;
        }
    }

    return;
}

void MergeSort(int A[], int n)
{
    int mid = n/2;
    int left[mid], right[n - mid];
    int i;

    if(n<=1) return;

    for ( i = 0; i < mid; i++ )
        left[i] = A[i];
    for ( i = 0; i < n - mid; i++ )
        right[i] = A[i + mid];

    int nL = sizeof(left)/sizeof(left[0]);
    int nR = sizeof(right)/sizeof(right[0]);

    MergeSort(left, nL);
    MergeSort(right, nR);
    Merge(left, right, nL, nR, A);
}

int main()
{
    int A[] = {98, 5, 6, 78, 223, 1, 45, 34, 78, 99};
    int n = sizeof(A)/sizeof(A[0]);
    int i = 0;

    MergeSort(A, n);

    for ( i = 0; i < n; i++ ) printf( "%d\n", A[i] );

    return 0;
}

感谢 chqrlie 和其他人的所有努力! :)

您的代码有多个问题...

最重要的是,您可以使用 sizeof 获取数组中元素的数量。 这仅适用于类型 char 和类似类型。对于任何更大的类型,您需要将大小(以字节为单位)除以元素的大小:

n = sizeof(A) / sizeof(A[0]);

MergeSort 函数中需要相同的修复,但在实例化数组之前计算左右两半的大小的局部变量会更简单。

为什么要将 MergeSort 的 return 值存储在 A[n] 中? A[n] 不仅越界,而且赋值没有任何意义,而且参数 A[n] 也是伪造的。 MergeSort 的 return 类型无论如何应该是 void。此行应为:

MergeSort(A, n);

在函数 MergeSort 中,右半部分的初始化循环不正确:

for ( i = mid; i < n; i++ )
    right[i] = A[i];

应该是:

for ( i = mid; i < n; i++ )
    right[i - mid] = A[i];

合并阶段也不正确:您应该将 A 作为参数传递,而不是将其设为局部变量。 mid 不是一个有意义的参数,leftright 数组是分开的,你不应该用 mid 偏移 right 中的索引。在比较最左边的剩余元素之前,您还应该测试 leftright 两半是否已用完。您目前遇到未定义的行为。

int n = sizeof(A);

这将使 n 成为 40 ,因此 A[n] 超出范围。

函数中int MergeSort

for ( i = mid; i < n; i++ )
    right[i] = A[i];

所以这里数组 right 索引以 index=mid 开头(数组索引以 0 开头)。

并且在函数中int Merge

    int n = nL + nR;
int i, j, k = 0;    //i and j not initialized .
int A[n];

for ( k = 0; k < n; k++ )
{
    if( left[i] <= right[mid + j] )  // Used here. What i and j have ?
    {
        A[k] = left[i];
        i = i + 1;
    }
    else
    {
        A[k] = right[mid + j];
        j = j + 1;
    }

在这个函数中 i j 没有被初始化并用作数组 index.Thus 又是一个出错的原因。