c - 合并排序不适用于所有情况

标签 c merge

我为合并排序编写了以下代码:

#include <stdio.h>

void mergeSort(int array[],int left, int right);

void mergeArray(int array[],int left,int middle, int right);

void mergeArray(int array[],int left,int middle, int right)
{

    int n1 = middle - left + 1;
    int n2 = right - middle ;

    int temp_a[n1];
    int temp_b[n2];

    int i = 0;
    int j = 0;
    int k = 0;

    for ( i = left ; i <= middle ; i++ )
    {
        temp_a[k++] = array[i];
    }

    for ( i = middle + 1 ; i < right + 1; i++ )
    {
        temp_b[j++] = array[i];
    }

    // now merge these two arrays


     i = 0;
     j = 0;
     k = 0;


    while ( i < n1 && j < n2 )
    {
        if ( temp_a[i] < temp_b[j])
        {
            array[k++] = temp_a[i++];

        }
        else
        {
            array[k++] = temp_b[j++];
        }
    }

    while ( i < n1 )
    {
        array[k++] = temp_a[i++];       
    }

    while ( j < n2 )
    {
        array[k++] = temp_b[j++];
    }



}


void mergeSort(int array[],int left, int right)
{
    // since there is only one element in the array.
    printf("I am in merge sort. left : %d, right : %d\n",left,right);
    if ( right - left < 1 )
    {
        return;
    }
    else
    {
        int middle = ( right - left ) / 2 ;
        mergeSort( array,left, middle );    
        mergeSort( array, middle +1 , right);

        mergeArray(array,left,middle,right);
    }


}

int main(int argc, char const *argv[])
{
    int n = 3;
    int i;

    int array[] = { 12,11,14,19};

    mergeSort(array,0,n);
    printf("\nArray is: \n");

    for (i = 0; i <= n; ++i)
    {
        printf("%d\n",array[i] );
    }
    return 0;
}

上述代码适用于 n = 1n = 2,但不适用于其他值。

最佳答案

三个问题:(1) 在 mergeArray 中,您使用 n1 代替 n2 来处理 temp_b。将其更改为:

int temp_b[n2];

(2) 创建temp_atemp_b后,在注释“now merge这两个数组”之后,需要将k设置为而不是0:

k = left;

(3) 在 mergeSort 中,您的 middle 表达式不正确,您需要添加而不是减去:

int middle = ( right + left ) / 2 ;

它应该适用于这三个更改。

关于c - 合并排序不适用于所有情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33528306/

相关文章:

javascript - 两个数组的智能合并(3-way-kindof)

database - 如何使用 DataSet 将数据从一个数据库传输到另一个数据库?

vector - 在结果向量中用填充指针合并两个向量

c - 错误将字符串中的字符转换为大写

c - 将结构写入映射内存文件(mmap)

c - GCC 函数属性与缓存

c - 奇怪的 C 语句作为结构中的字段

c - 将位图文件读入结构

R:使用第二个表合并+更新表的有效方法,其中来自相同列名的值填充 NA

merge - UML 2.5 : What happens with attributes of same name but different type in a package merge?