C語言實現(xiàn)在數(shù)組A上有序合并數(shù)組B的方法
本文實例講述了C語言實現(xiàn)在數(shù)組A上有序合并數(shù)組B的方法,分享給大家供大家參考。具體分析如下:
題目:數(shù)組A和數(shù)組B均有序,數(shù)組A有足夠大內(nèi)存來容納數(shù)組B,將數(shù)組B有序合并到數(shù)組A中
分析:如果由前至后合并,復(fù)雜度將會是O(N2),這樣的復(fù)雜度顯然不是最優(yōu)解,利用兩個指針指向兩個數(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; }
代碼寫完后似乎完成了所需功能,但還不止于此,必須對上述代碼做UT
1. 健壯性
arrayA或arrayB為空,長度小于0
2. 邊界用例
arrayA為空,長度為1;arrayB不為空,長度大于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)過上面的測試,不難發(fā)現(xiàn)在邊界條件用例中,代碼已經(jīng)不能正確運行出結(jié)果,在測試用例的驅(qū)動下,不難寫出正確代碼如下:
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種情形需要進行處理 if (posA < 0 && posB >= 0) { while (posB >= 0) { arrayA[posA + posB + 1] = arrayB[posB]; posB--; } } return arrayA; }
相信本文所述對大家C程序算法設(shè)計的學(xué)習(xí)有一定的借鑒價值。
欄 目:C語言
下一篇:C++實現(xiàn)尋找最低公共父節(jié)點的方法
本文標題:C語言實現(xiàn)在數(shù)組A上有序合并數(shù)組B的方法
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3353.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對數(shù)怎么表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實例總結(jié)
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文