C語言實現在陣列A上有序合併陣列B的方法

2022-10-04 04:12:09 字數 1726 閱讀 9973

題目:陣列a和陣列b均有序,陣列a有足夠大記憶體來容納陣列b,將陣列b有序合併到陣列a中

分析:如果由前至後合併,複雜度將會是o(n2),這樣的複雜度顯然不是最優解,利用兩個指標指向兩個陣列的尾部,從後往前遍歷,這樣的複雜度為o(n2)

由此可以寫出下面的**:

#include

#include

#include

using namespace std;

int arraya[10] = ;

int arrayb = ;

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)

else

copy(arraya, arraya + 10, ostream_iterator(cout, " "));

system("pause");

} return arraya;

}void main()

**寫完後似乎完成了所需功能,但還不止於此,必須對上述**做ut

1. 健壯性

arraya或arrayb為空,長度小於0

2. 邊界用例

arraya為空,長度為1;arrayb不為空,長度大於1

首元素用例

const int size = 6;

int arraya[size] = ;

int arrayb = ;

反之const int size = 6;

int arraya[size] = ;

int arrayb = ;

3. 正常用例:

const int size = 10;

int arraya[size] = ;

int arrayb = ;

const int size = 10;

int arraya[size] = ;

int arrayb = ;

const int size = 10;

int arraya[size] = ;

int arrayb = ;

const int size = 10;

int arraya[size] = ;

int arrayb = ;

經過上面的測試,不難發現在邊界程式設計客棧條件用例中,**已經不能正確執行出結果,在測試用例的驅動下,不難寫出正確**如下:

int* mergearray(int *arraya, int sizea, int *arrayb, int sizeb)

else

copy(arraya, arraya + size, ostream_iterator(cout, " "));

system("pause");

} //出現兩種情形:

//1. posa < 0 && posb >= 0

//2. posa >= 0 && posb < 0

//只有第1種情形需要進行處理

if (posa < 0 && posb >= 0)

} return arraya;

}本文標題: c語言實現在陣列a上有序合併陣列b的方法

本文位址: /ruanjian/c/113740.html

C 實現在陣列中插入1 100的隨機數

面試原題 實現填充1 100到乙個容器為100的陣列中,不能重複,陣列只可以定義乙個。這是我上半年面試時遇到的一道題,當時第一次遇到就做出來,很有成就感,面試官現場給了我五分鐘 花了三分鐘想出來描述給他聽。不過前些時候學linq又遇到了一種方法,下午正好有空整理了下 國慶來臨,除了開會的別的基本都提...

兩有序陣列中位數 c語言實現

給定兩個大小為 m 和 n 的有序陣列 a 和 b。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 a 和 b 不會同時為空。include include define min a,b a length a if x2 length b return ...

C語言實現有序表

include include define list init size 80 define listincreament 10 define error 0 錯誤的時候的定義 define ok 1 正確的定義 define overrlow 2 typedef struct sllist sq...