合并排序算法中的输出错误

时间:2017-09-04 11:43:02

标签: c algorithm mergesort

我非常仔细地遵循了所有算法步骤,但仍然总是输出错误的答案。我不明白为什么。我认为合并算法中出现了一些错误,导致了这一点,但无法确定是什么。请帮忙。如果有任何可以改进的代码,请建议。

谢谢

INPUT - {5,6,1,8,9,7}

输出 - {1,0,7,0,9,7}

#include<stdio.h>
#include<malloc.h>

void mergeSort(int array[],int length);
void merge(int *leftArray,int *rightArray,int *array);

void main()
{

    int array[] = {5,6,1,8,9,7};
    int length_of_array;

    length_of_array = sizeof(array) / sizeof(array[0]);

    mergeSort(array,length_of_array);

    int i;

    for(i=0;i<length_of_array;i++)
    {
        printf("%d->",array[i]);
    }
}

void mergeSort(int array[],int length)
{

    if(length <  2)
        return;


    int mid;
    int i;

    mid = length/2;

    int *leftArray, *rightArray;

    leftArray = (int*)malloc(mid*sizeof(int));
    rightArray = (int*)malloc((length-mid)*sizeof(int));

    for(i=0;i<mid;i++)
        leftArray[i] = array[i];

    for(i=mid;i<length;i++)
        rightArray[i-mid] = array[i];


    mergeSort(leftArray, mid);
    mergeSort(rightArray, length-mid);

    merge(leftArray,rightArray,array);

}

void merge(int *leftArray,int *rightArray,int *array)
{
    int i,j,k;
    i = j = k = 0;

    int leftSize = sizeof(leftArray)/sizeof(leftArray[0]);
    int rightSize = sizeof(rightArray)/sizeof(rightArray[0]);

    while(i < leftSize && j < rightSize)
    {
        if(leftArray[i]<rightArray[j])
        {
            array[k] = leftArray[i];
            k = k + 1;
            i = i + 1;
        }
        else
        {
            array[k] = rightArray[j];
            k = k + 1;
            j = j + 1;
        }

    }

    while(i<leftSize)
    {
        array[k] = leftArray[i];
        k = k + 1;
        i = i + 1;

    }

    while(j<rightSize)
    {
        array[k]  = rightArray[j];
        k = k + 1;
        j = j + 1;

    }

}

1 个答案:

答案 0 :(得分:3)

正如@molbdnilo所评论的那样,你无法从指针参数中获得数组的大小。因此merge需要获取左右数组的长度以及指向它们的指针。

问题是C中的数组不是完整的&#39;数据类型,而只是一个方便的语法。在merge函数中,参数int *leftArray正是它所说的 - 指向整数的指针。所以sizeof会告诉你指针的大小。在main函数中,array已知是一个数组,其长度是已知的(从给定的初始值开始),因此sizeof可以给出分配给它的实际内存大小变量。但是这个大小并没有存储在变量的任何地方,所以它不会被传递到merge - 唯一传入的是指向内存块的指针。

此外,虽然在这种情况下它不会给您带来问题,但您应该free leftArrayrightArray指针malloc 。这样,您可以在实际应用程序中使用排序功能而不会泄漏内存。