最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言實(shí)現(xiàn)在數(shù)組A上有序合并數(shù)組B的方法

 更新時(shí)間:2014年09月17日 14:49:28   投稿:shichen2014  
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)在數(shù)組A上有序合并數(shù)組B的方法,包含了數(shù)組操作的完整實(shí)現(xiàn)過程以及相應(yīng)的代碼分析與改進(jìn),具有不錯(cuò)的借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了C語(yǔ)言實(shí)現(xiàn)在數(shù)組A上有序合并數(shù)組B的方法,分享給大家供大家參考。具體分析如下:

題目:數(shù)組A和數(shù)組B均有序,數(shù)組A有足夠大內(nèi)存來容納數(shù)組B,將數(shù)組B有序合并到數(shù)組A中

分析:如果由前至后合并,復(fù)雜度將會(huì)是O(N2),這樣的復(fù)雜度顯然不是最優(yōu)解,利用兩個(gè)指針指向兩個(gè)數(shù)組的尾部,從后往前遍歷,這樣的復(fù)雜度為O(n2)

由此可以寫出下面的代碼:

#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;

int arrayA[10] = {1, 3, 5, 7, 9};
int arrayB[] = {2, 4, 6, 8, 10};
const int sizeB = sizeof arrayB / sizeof *arrayB;
const int sizeA = sizeof arrayA / sizeof *arrayA - sizeB;

int* mergeArray(int *arrayA, int sizeA, int *arrayB, int sizeB)
{
 if (arrayA == NULL || arrayB == NULL || sizeA < 0 || sizeB < 0)
 return NULL;

 int posA = sizeA - 1;
 int posB = sizeB - 1;

 while (posA >= 0 && posB >= 0)
 {
 if (arrayA[posA] < arrayB[posB])
 {
  arrayA[posA + posB + 1] = arrayB[posB];
  posB--;
 }
 else
 {
  arrayA[posA + posB + 1] = arrayA[posA];
  posA--;
 }
 copy(arrayA, arrayA + 10, ostream_iterator<int>(cout, " "));
 system("pause");
 }

 return arrayA;
}

void main()
{
 int *result = mergeArray(arrayA, sizeA, arrayB, sizeB);

 copy(result, result + 10, ostream_iterator<int>(cout, " "));
 cout << endl;
}

代碼寫完后似乎完成了所需功能,但還不止于此,必須對(duì)上述代碼做UT

1. 健壯性

arrayA或arrayB為空,長(zhǎng)度小于0

2. 邊界用例

arrayA為空,長(zhǎng)度為1;arrayB不為空,長(zhǎng)度大于1
首元素用例
const int size = 6;
int arrayA[size] = {2};
int arrayB[] = {0, 1, 1, 1, 1};
反之
const int size = 6;
int arrayA[size] = {0, 1, 1, 1, 1};
int arrayB[] = {2};

3. 正常用例:

const int size = 10;
int arrayA[size] = {1, 3, 5, 7, 9};
int arrayB[] = {2, 4, 6, 8, 10};

const int size = 10;
int arrayA[size] = {2, 4, 6, 8, 10};
int arrayB[] = {1, 3, 5, 7, 9};

const int size = 10;
int arrayA[size] = {1, 2, 3, 4, 5};
int arrayB[] = {6, 7, 8, 9, 10};

const int size = 10;
int arrayA[size] = {6, 7, 8, 9, 10};
int arrayB[] = {1, 2, 3, 4, 5};

經(jīng)過上面的測(cè)試,不難發(fā)現(xiàn)在邊界條件用例中,代碼已經(jīng)不能正確運(yùn)行出結(jié)果,在測(cè)試用例的驅(qū)動(dòng)下,不難寫出正確代碼如下:

int* mergeArray(int *arrayA, int sizeA, int *arrayB, int sizeB)
{
 if (arrayA == NULL || arrayB == NULL || sizeA < 0 || sizeB < 0)
 return NULL;

 int posA = sizeA - 1;
 int posB = sizeB - 1;

 while (posA >= 0 && posB >= 0)
 {
 if (arrayA[posA] < arrayB[posB])
 {
  arrayA[posA + posB + 1] = arrayB[posB];
  posB--;
 }
 else
 {
  arrayA[posA + posB + 1] = arrayA[posA];
  posA--;
 }
 copy(arrayA, arrayA + size, ostream_iterator<int>(cout, " "));
 system("pause");
 }

 //出現(xiàn)兩種情形:
 //1. posA < 0 && posB >= 0
 //2. posA >= 0 && posB < 0
 //只有第1種情形需要進(jìn)行處理
 if (posA < 0 && posB >= 0)
 {
 while (posB >= 0)
 {
  arrayA[posA + posB + 1] = arrayB[posB];
  posB--;
 }
 } 
 return arrayA;
}

相信本文所述對(duì)大家C程序算法設(shè)計(jì)的學(xué)習(xí)有一定的借鑒價(jià)值。

相關(guān)文章

最新評(píng)論

新昌县| 吴旗县| 淄博市| 锦州市| 江城| 湘阴县| 青田县| 巴林左旗| 伊宁市| 济南市| 龙州县| 潞城市| 平阴县| 腾冲县| 长治县| 仪陇县| 都匀市| 鄂托克旗| 北流市| 衡阳县| 沈丘县| 辽宁省| 弥勒县| 淮滨县| 岳西县| 新闻| 大方县| 措勤县| 合作市| 高邑县| 剑河县| 金寨县| 安平县| 波密县| 平南县| 宜阳县| 方山县| 兴业县| 遵化市| 周口市| 自治县|