通过将最小的数字放在第一个中将两个数组合并为一个

时间:2013-02-14 23:20:32

标签: c++ function sorting

我需要浏览a和b数组,将a和b中的元素复制到组合中,以便组合最终被排序。

例如,如果a为{3,5,7,7,9}且b为{2,5,8,1234}(因此组合必须有9个元素),则此函数将组合设置为{2 ,3,5,5,7,7,8,9,1234}。我需要有效率:当我将值放入组合时,我需要将它们放在正确的位置;不要随意地重新安排它们。

我在while循环中尝试了一个嵌套的for循环,但是我得到了一些奇怪的结果。我似乎无法找到一种方法来超越最低数字。例如,一旦我将最小的数字添加到组合数组中,我可以; t弄清楚如何丢弃它本身。谢谢您的帮助。

void merge( 
    unsigned combo[], 
    const unsigned a[],
    unsigned aElements,
    const unsigned b[],
    unsigned bElements 
){

    if (mySort(a, aElements) == 0) {
        cout << "The first array is not sorted";
        exit(1);
    }

    if (mySort(b, bElements) == 0) {
        cout << "The second array is not sorted";
        exit(1);
    }

    unsigned combinedElements;
    unsigned lowest = 0;
    unsigned i = 0;

    combinedElements = aElements + bElements;

    while (i < combinedElements) {
        for (int n = 0; n < combinedElements; n++) {
            if (a[i] < b[n]) {
                lowest = a[i];
            }

            else {
                lowest = b[n];
            }
        }

        combo[i] = lowest;
        i++;
        cout << combo[i] << endl;
    }


}

5 个答案:

答案 0 :(得分:4)

除非这是家庭作业,否则请使用std::merge

void merge( 
    unsigned combo[], 
    const unsigned a[],
    unsigned aElements,
    const unsigned b[],
    unsigned bElements 
){
    std::merge(a, a+aElements, b, b+bElemnts, combo);
}

如果作业,请尝试此算法:

index_result = 0; index_a = 0; index_b = 0;
while(index_a < size_a && index_b < size_b)
  if(a[index_a] < b[index_b])
    result[index_result++] = a[index_a++]
  else
    result[index_result++] = b[index_b++]
while(index_a < size_a)
  result[index_result++] = a[index_a++]
whle(index_b < size_b)
  result[index_result++] = b[index_b++]

答案 1 :(得分:3)

我认为这是某种类型的家庭作业,如果不是,只需使用std::merge

如果你想手动滚动它,你需要考虑使用三个游标:两个是两个不同数组的输入游标,另一个是输出(写)游标。

在决定要移动下一个元素的数组之后,需要复制和更新两个游标,即该数组中的读取游标(因为该元素已被使用)并且最终数组中的写入游标(因为该位置已被写入)。

我希望这足以引导您找到解决方案:)

答案 2 :(得分:1)

以下是您可以尝试的标准内容列表:http://www.cplusplus.com/faq/sequences/sequencing/sort-algorithms/

另外,你有没有在psuedo-code中考虑过这样的事情:

创建一个新数组[旧数组的大小减一] mempcy(新数组,开始删除点-1) mempcy(新阵列,删除点+ 1到结束)

从新数组中排序

再次罚款最低数字......

答案 3 :(得分:0)

这是一个非常紧凑的解决方案,应该易于阅读和理解。

我假设combo有足够的空间来容纳结果,ab已经订购了(正如您的示例所示):

void merge(unsigned combo[], 
           const unsigned a[],
           unsigned aElements,
           const unsigned b[],
           unsigned bElements)
{
    while(aElements + bElements > 0)
    {
      if(bElements == 0 || (aElements > 0  && *a < *b))
      {
          aElements--;
          *combo++ = *a++;
      }
      else
      {
          bElements--;
          *combo++ = *b++;
      }
   }
}

可以略微调整以获得更好的性能,但它非常优雅且可读。另外,这段代码兼容C和C ++。

答案 4 :(得分:0)

假设这是用于家庭作业或类似的东西,并且你不允许使用像std::merge这样的标准内容,2个排序列表的合并算法可以像线性复杂一样完成:

void merge( unsigned combo[], const unsigned a[], unsigned aElements, const unsigned 
b[],    unsigned bElements ){

    if (mySort(a, aElements) == 0) {
        cout << "The first array is not sorted";
        exit(1);
    }

    if (mySort(b, bElements) == 0) {
        cout << "The second array is not sorted";
        exit(1);
    }

    int i,j,k =0;
    while (i<aElements && j<bElements)
    {
        if (a[i]<=b[j])
        {
            combo[j++]=a[i++];
        } else
        {
            combo[j++]=b[j++];
        }
    }

    //add remaining elements. at least one of these loops will not happen
    while (i < aElements) combo[j++]=a[i++];
    while (j < bElements) combo[j++]=b[j++];
}