将两个数组排序为组合数组

时间:2012-09-23 03:57:03

标签: c++ algorithm mergesort

我几年没有做任何编程课程,所以请原谅任何初学者错误/做某事的方法。我喜欢对未来的建议。使用下面的代码,我试图检查两个数组的值(已经排序)并将它们放入组合数组中。我的解决方案,无论多么低效/草率,都是使用for循环来比较j处每个数组索引的内容,然后将较低的值分配给combinedArray的索引i,将较高的值分配给索引i + 1。我将i递增2以避免覆盖前一个循环的索引。

int sortedArray1 [5] = {11, 33, 55, 77, 99};
int sortedArray2 [5] = {22, 44, 66, 88, 00};
combinedSize = 10;
int *combinedArray;
combinedArray = new int[combinedSize];
    for(int i = 0; i <= combinedSize; i+=2)
{
    for(int j = 0; j <= 5; j++)
    {
        if(sortedArray1[j] < sortedArray2[j])
        {
            combinedArray[i] = sortedArray1[j];
            combinedArray[i+1] = sortedArray2[j];
        }
        else if(sortedArray1[j] > sortedArray2[j])
        {
            combinedArray[i] = sortedArray2[j];
            combinedArray[i+1] = sortedArray1[j];
        }
        else if(sortedArray1[j] = sortedArray2[j])
        {
            combinedArray[i] = sortedArray1[j];
            combinedArray[i+1] = sortedArray2[j];
        }
    }
}

for(int i = 0; i < combinedSize; i++)
{
    cout << combinedArray[i];
    cout << " ";
}

我的结果就是这个

Sorted Array 1 contents: 11 33 55 77 99
Sorted Array 2 contents: 0 22 44 66 88
5 77 5 77 5 77 5 77 5 77 Press any key to continue . . .

在我缺乏经验的头脑中,排序的实现看起来很好,所以我不确定为什么我会得到这个糟糕的输出。建议太棒了。

5 个答案:

答案 0 :(得分:3)

怎么样:

int i=0,j=0,k=0;
while(i<5 && j<5)
     {
        if(sortedArray1[i] < sortedArray2[j])
         {
           combinedArray[k]=sortedArray1[i];
            i++;
          }
       else
         {
           combinedArray[k]=sortedArray2[j];
           j++;
          }
      k++;
     }
   while(i<5)
     {
           combinedArray[k]=sortedArray1[i];
           i++;k++;
          }
   while(j<5)
     {
           combinedArray[k]=sortedArray2[j];
           j++;  k++;

          }

答案 1 :(得分:1)

在查看实施之前,请检查算法并用笔和纸将其写下来。弹出的第一件事是你假设结果中的前两个元素将来自每个源数组。不一定是这种情况,考虑两个数组,其中一个中的所有元素都小于另一个中的所有元素和预期结果:

int a[] = { 1, 2, 3 };
int b[] = { 4, 5, 6 };

如果您希望对结果进行排序,那么前三个元素将来自第一个数组。考虑到这一点,请考虑您对数据的真正了解。特别是,两个数组都被排序,这意味着第一个元素将小于相应数组中其余元素。这意味着较小的元件是较小的元件。通过将该元素放入结果中,您可以将问题减少到较小的集合。您有a' = { 2, 3 }b = { 4, 5, 6 }res = { 1 }以及res知道a'b已排序的{{1}}的第二个元素的新问题

在纸上弄清楚你需要做什么,然后应该直接将其映射到代码。

答案 2 :(得分:1)

因此,我修改了您的代码以使其正常工作。实际上,为两个排序的数组提供两个指针/索引是个好主意。这样您就可以在将其添加到combinedArray后更新相应的指针。如果您不理解此代码的任何部分,请告诉我。感谢。

    int sortedArray1 [5] = {11, 33, 55, 77, 99};
    int sortedArray2 [5] = {0, 22, 44, 66, 88}; 
    int combinedSize = 10;
    int *combinedArray;
    combinedArray = new int[combinedSize];
    int j = 0;
    int k = 0;
    for(int i = 0; i < combinedSize; i++)
    {
            if (j < 5 && k < 5) {
                    if (sortedArray1[j] < sortedArray2[k]) {
                            combinedArray[i] = sortedArray1[j];
                            j++;
                    } else {                  
                            combinedArray[i] = sortedArray2[k];
                            k++;
                    }                         
            } 
            else if (j < 5) {
                    combinedArray[i] = sortedArray1[j];
                    j++;
            }                         
            else {
                    combinedArray[i] = sortedArray2[k];
                    k++;
            }                         
    }

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

答案 3 :(得分:0)

else if(sortedArray1[j] = sortedArray2[j]),您的意思是else if(sortedArray1[j] == sortedArray2[j])吗?

前一个会将sortedArray2 [j]的值赋给sortedArray1 [j] - 这就是为什么你得到5 77 5 77...

的原因

但是5来自哪里? sortedArray中没有5,但我发现for(int j = 0; j <= 5; j++)一定是错误的。大小N数组的最高索引是N-1,而不是C / C ++中的N(但不是基本的)..所以使用j<5作为条件,或者你可能会陷入一些难以解释或预测的情况。

毕竟,算法本身存在问题,每次外循环循环时,它最终将比较两个数组中的最后一个元素,这使得输出重复两个数字。

因此您还需要更正算法,请参阅Merge Sort

答案 4 :(得分:0)

略有不同的方法,这是恕我直言的更清洁:

//A is the first array, m its length
//B is the second array, n its length
printSortedAndMerged(int A[], int m, int B[], int n){
    int c[n+m];
    int i=0, j=0;

    for(int k=0; k < n+m; k++){

        if(i < m && j < n){
            if(A[i] < B[j]){
                c[k] = A[i];
                i++;
            }
            else{
                c[k] = B[j];
                j++;
            }
            continue; //jump to next iteration
        }

        if(i < m){ // && ~(j < n)
        //we already completely traversed B[]
            c[k] = A[i];
            i++;
            continue;
        }

        if(j < n){ // %% ~(i < m)
        //we already completely traversed A[]
            c[k] = B[j];
            j++;
            continue;
        }

        //we should never reach this
        cout << "Wow, something wrong happened!" << endl;
}//for

for(int i=0; i<n+m; i++){
    cout << c[i] << endl;
}
}

希望它有所帮助。