使用for循环合并两个已排序的数组

时间:2016-10-14 16:58:49

标签: c++ arrays array-merge

我有一个函数将两个已排序的数组合并为一个并返回指向它的指针。我想使用for循环而不是一段时间。但是在某些测试用例中,合并数组的最后1或2个元素不在其位置。如果有人可以帮助解决这个问题而保持for循环,我将不胜感激。

int * mergeSort(int arr1[], int arr2[],int len)
{

  /* len is the combined length of the two arrays */

    static int sorted[100];

    int pos1=0, pos2=0;

    for (int i=0; i<len; i++)
    {
        if (arr1[pos1]<=arr2[pos2])
        {
            sorted[i]=arr1[pos1];
            pos1++;
        }
        else
        {
            sorted[i]=arr2[pos2];
            pos2++;
        }
    }

    return sorted;
}

2 个答案:

答案 0 :(得分:0)

您的问题是您似乎无法处理超出输入数组的末尾。如果存在未初始化的内存 - 则会出现未定义的行为。

您可以通过使用sentinel值终止数组来避免这种情况,例如INT_MAX,它应该始终大于数组中所有可能的值:

int a[] = { 1, 2, 104, INT_MAX};
int b[] = { 101, 102, 105, INT_MAX};

int* ptr = mergeSort(a,b,6);

for(int i = 0; i < 6; i++){
    cout << i << " " << ptr[i] << endl;
}

live demo

或者你可以传递两个数组的实际长度并正确处理它们:

int * mergeSort(int arr1[], int len1, int arr2[],int len2)
{

  /* len is the combined length of the two arrays */

    static int sorted[100];

    int pos1=0, pos2=0;

    for (int i=0; i< len1 + len2; i++)
    {
        if ((pos2 == len2) || (arr1[pos1] <= arr2[pos2] && (pos1 < len1)))
        {
            sorted[i]=arr1[pos1];
            pos1++;
        }
        else
        {
            sorted[i]=arr2[pos2];
            pos2++;
        }
    }

    return sorted;
}

live demo

答案 1 :(得分:0)

这并没有回答你的代码有什么问题,但是为了回答如何合并两个有序范围的问题我建议std::merge

    int * mergeSort(int arr1[], int arr2[], int len1, int len2)
    {
        //I am not condoning the use of a static buffer here,
        //I would probably use a std::vector or std::array,
        //possibly a boost::static_vector if really necessary
        static int sorted[100];
        std::merge(arr1, arr1 + len1, arr2, arr2 + len2, sorted);
        return sorted;
    }

我还将int len更改为int len1, int len2,因为您需要知道各个数组的长度,而不仅仅是它们的组合长度,以避免读取输入数组的末尾。