c - 将 2 个已排序数组合并到一个新的已排序数组中不起作用。我究竟做错了什么?

标签 c sorting merge

该函数将sorted1和sorted2合并到一个新的排序数组(结果)中。 90% 的情况下,此函数工作正常,但有时 1-2 个数字不在其应有的位置(大多数情况下,这些数字是最后一个数字)。

有人可以帮我找出我做错了什么吗?

void merge2(int *sorted1,int *sorted2,int *result,int K)
{   
    int i,j,k;
    i=j=k=0;

    while(i<K && j<K)
    {
        if(*(sorted1+i)>*(sorted2+j))
        {
            *(result+k)=*(sorted2+j);
            j++;
            k++;
            if(*(sorted1+i)<*(sorted2+j))
            {
                *(result+k)=*(sorted1+i);
                i++;
                k++;
            }
        }   
        else if(*(sorted1+i)<*(sorted2+j))
        {
            *(result+k)=*(sorted1+i);
            i++;
            k++;
            if(*(sorted1+i)>*(sorted2+j))
            {
                *(result+k)=*(sorted2+j);
                j++;
                k++;
            }                
        }
        else
        {
            *(result+k)=*(sorted1+i);
            k++;
            i++;
            *(result+k)=*(sorted2+j);
            k++;
            j++;
        }  
    }

    while(i<K)
    {
        *(result+k)=*(sorted1+i);
        i++;
        k++;
    }

    while(j<K)
    {
        *(result+k)=*(sorted1+j);
        j++;
        k++;
    }        
}

最佳答案

您使用i作为sorted1的计数器,j作为sorted2的计数器。当 i 到达 K 底部时,while 循环应该用排序 2 的剩余元素填充结果的其余部分,但是您用排序 1 中的元素填充它。这意味着无论哪个计数器首先击中 K,其余的都会用排序 1 填充,因此解决方法是:

while(j<K)
{
    *(result+k)=*(sorted2+j);  // This used to be sorted1
    j++;
    k++;
}

您提到错误大多数时候出现在末尾,这意味着还存在其他错误。如果您可以提供出现这种情况的数据集(错误不在最后),我将通过修复来修改我的答案(假设我可以找到它)。

请注意,最里面的分支并不是绝对必要的。第一个循环正在执行的操作的伪代码:

1    if sorted1[i] > sorted2[j]:
2        result[k++] = sorted2[j++]
3        if sorted1[i] < sorted2[j]:
4            result[k++] = sorted1[i++] 
5    else if sorted1[i] < sorted2[j]:
6        result[k++] = sorted1[i++]
7        if sorted1[i] Z sorted2[j]:
8            result[k++] = sorted1[i++]
9    else
10       result[k++] = sorted1[i++]
11       result[k++] = sorted2[j++]

第 3 行和第 4 行执行的操作与第 5 行和第 6 行执行下一次循环迭代的操作相同,而第 7 行和第 8 行执行的操作与第 1 行和第 2 行执行的操作相同。您可以将其减少为:

1    if sorted1[i] > sorted2[j]:
2        result[k++] = sorted2[j++]
3    else if sorted1[i] < sorted2[j]:
4        result[k++] = sorted1[i++]
5    else
6        result[k++] = sorted1[i++]
7        result[k++] = sorted2[j++]

编辑:最后,请注意,通过将 i 和 j 与 K 进行比较,您的合并算法仅在排序 1 和排序 2 都是 K 个元素长的情况下才起作用。我认为这是我的答案中设计的,但对于更通用的解决方案,请传入两个数组的大小并将 i 和 j 与各自的对应项进行比较。

关于c - 将 2 个已排序数组合并到一个新的已排序数组中不起作用。我究竟做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22488398/

相关文章:

php - 对 laravel 关系集合的自定义排序

r - 如何粘贴数据框行中的文本,仅保留 R 中的唯一值

c# - 根据条件在 C# 中合并两个列表

merge - "TF14083: The item {0} has a pending merge from the current merge operation"合并TFS2008时

c - 25 : warning: initializer element is not a constant expression

c - 读取N并打印以下: 2, 4(2个数字); 3,9,27(3个数字)

python - 对数组中的值进行排序 : 'reverse' is an invalid keyword argument for this function

c - C 中是否有 C++ 模板的等效项?

c - 如何释放在双指针结构上分配的内存

algorithm - 对于大数组,选择排序比插入快吗?