国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言實現在數組A上有序合并數組B的方法

2020-01-26 15:18:13
字體:
來源:轉載
供稿:網友

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

題目:數組A和數組B均有序,數組A有足夠大內存來容納數組B,將數組B有序合并到數組A中

分析:如果由前至后合并,復雜度將會是O(N2),這樣的復雜度顯然不是最優解,利用兩個指針指向兩個數組的尾部,從后往前遍歷,這樣的復雜度為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};

經過上面的測試,不難發現在邊界條件用例中,代碼已經不能正確運行出結果,在測試用例的驅動下,不難寫出正確代碼如下:

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"); } //出現兩種情形: //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程序算法設計的學習有一定的借鑒價值。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 中山市| 建始县| 宣汉县| 岢岚县| 丰台区| 浠水县| 贵南县| 孟村| 关岭| 罗源县| 闽清县| 罗定市| 雷州市| 永寿县| 曲靖市| 中江县| 枝江市| 恩施市| 宝坻区| 满洲里市| 东阳市| 富锦市| 类乌齐县| 海丰县| 嘉义县| 陇西县| 温州市| 方城县| 英吉沙县| 徐汇区| 晋城| 缙云县| 观塘区| 平昌县| 沙洋县| 垣曲县| 台湾省| 桦南县| 大厂| 合阳县| 宁强县|