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

來源:互聯網
上載者:User

本文執行個體講述了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程式演算法設計的學習有一定的借鑒價值。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.