題目:陣列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...