当前位置:主页   - 电脑 - 程序设计 - C/C++
[算法问题]合并两个已经排序的数组为另一个数组
来源:网络   作者:   更新时间:2011-01-14
收藏此页】    【字号    】    【打印】    【关闭

  问题描述:

  设子数组a[0:k]和a[k+1:n-1]已排好序(0<=k<=n-1).试设计一个合并这两个子数组为排好序的数组a[0:n-1]的算法.要求算法在最坏的情况下所用的计算时间为O(n), 且只用到O(1)的辅助空间.

  这一题比较简单,看代码就知道了.

#include <stdio.h>

void DisplayArray(int *pArray, int nLen)
{
    for (int i = 0; i < nLen; ++i)
    {
        printf("array[%d] = %dn", i, pArray[i]);
    }
}

// pArray1和pArray2是已经排好序的数组,要求将它们按照顺序合并到pArray中
// 排序之后的数组不会有重复的元素
void MergeArray(int *pArray1, int nLen1, int *pArray2, int nLen2, int *pArray)
{
    int i, j, n;

    i = j = n = 0;
    while (i < nLen1 && j < nLen2)                  // 循环一直进行到拷贝完某一个数组的元素为止
    {
        if (pArray1[i] < pArray2[j])                // 拷贝array1的元素
        {
            pArray[n++] = pArray1[i++];
        }
        else if (pArray1[i] > pArray2[j])            // 拷贝array2的元素
        {
            pArray[n++] = pArray2[j++];                      
        }
        else                                          // 相等的元素拷贝
        {
            pArray[n++] = pArray2[j++];                      
            ++i;
        }
    }

    if (i == nLen1)                              // 如果array1已经被拷贝完毕就拷贝array2的元素
    {
        while (j < nLen2)
            pArray[n++] = pArray2[j++];
    }
    else                                         // 如果array2已经被拷贝完毕就拷贝array1的元素
    {
        while (i < nLen1)
            pArray[n++] = pArray1[i++];
    }
}

int main()
{      
    int array1[] = {1, 4, 5, 7};
    int array2[] = {2, 3, 6, 8};
    int array3[8];
    MergeArray(array1, 4, array2, 4, array3);
    printf("Merge Array:n");
    DisplayArray(array3, 8);

    return 1;
}

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明