2013-11-01 111 views
0

我和我的朋友正在努力使用合併功能。它要求兩個數組具有相同的大小,因此合併數組的數量是兩倍。這是我們到目前爲止:按升序合併兩個數組(兩個數組的大小相同)

void mergeTwoSortedArrays(const int a1[], const int a2[], int mergedArray[], int n) 
{ 
    int i = 0; 
    int j = 0; 
    int k = 0; 

    while (i <= n && j <= n) 
    { 
     if (a1[i] == a2[j]) 
     { 
      mergedArray[k] = a1[i]; 
      mergedArray[k] = a2[j]; 
      i++; 
      j++; 
     } 
     k++; 
    } 
} 

但它不工作。有小費嗎?

+1

歡迎堆棧溢出!感謝您發佈您的代碼,但請在您的問題中多加一點說明:您有什麼問題,您期望得到什麼結果,以及[您嘗試過什麼](http://whathaveyoutried.com)到目前爲止?通過[問題清單](http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist)將幫助我們更好地回答你的問題。謝謝! –

回答

5

這是用於合併排序還是什麼?通常的做法是做合併合併,就像你已經完成的一樣,然後是複製。這是第一部分。你有點困惑。通讀這一點,你會看到它是有道理的:

while (i < n && j < n) { 
    if (a1[i] <= a2[j]) { 
     mergedArray[k++] = a1[i++]; 
    } else { 
     mergedArray[k++] = a2[j++]; 
    } 
} 

然後你處理其餘的元素。當只有一個數組到達結尾時,循環顯然會結束。所以現在你需要兩個更簡單的循環。只有一個將執行 - 無需複雜的測試:

while (i < n) mergedArray[k++] = a1[i++]; 
while (j < n) mergedArray[k++] = a2[j++]; 

我把你的測試分爲<代替<=,因爲數組是從零開始的。

+0

+1這與我總是用於合併列表的算法幾乎相同,只有更接近的不同(我使用'if(i WhozCraig

0

這就是我想出了 -

void mergeTwoSortedArrays(const int a1[], const int a2[], int mergedArray[], int n) { 

    int i = 0; 
    int j = 0; 
    int k = 0; 

    // Iterate and compare two input arrays until at least one of them reaches to boundary. 
    while (i < n && j < n) { 
     if (a1[i] < a2[j]) { 
      mergedArray[k++] = a1[i++]; 
     } 
     else if (a1[i] > a2[j]) { 
      mergedArray[k++] = a2[j++]; 
     } 
     else if (a1[i] == a2[j]) { 
      mergedArray[k++] = a1[i++]; 
      mergedArray[k++] = a2[j++]; 
     } 
    } 

    // Copy the remaining items from the other array, without comparison until, boundary. 
    while (i < n) mergedArray[k++] = a1[i++]; 
    while (j < n) mergedArray[k++] = a2[j++]; 

} 
+0

阿肖克,我們有一些接近你: 空隙mergeTwoSortedArrays(const int的A1 [],const int的A2 [],INT mergedArray [],INT N) { INT I = 0; int j = 0; int k = 0; (a1 [i] <= a2 [j]) {i khguru13

+0

嘗試這些數組: int a [] = {1,2,3,4,5} int b [] = {1,2,3,3}} 它返回{1,1,2 ,2,3,3,3,3,0,1}。 我們認爲它經歷了a中的前三個元素,然後它遍歷所有b,並且它將j計數到5,然後它不知道如何處理a,因爲b中沒有第六個元素[]。 我們做錯了什麼? – khguru13

+0

@ khguru13你錯過了合併後的複製操作。你沒看過我的回答嗎?或者這個,就是這個問題。 – paddy

0

我不知道,如果你想將它們合併爲交錯他們或只是連接兩個不同的陣列。如果它大步:

#include <iostream> 

void mergeTwoArraysIntoOne(const int* lhs, const int* rhs, int* dst, size_t numElements) { 
    const int* const endLhs = lhs + numElements; 
    const int* const endRhs = rhs + numElements; 
    for (; lhs < endLhs ;) { 
     while (rhs < endRhs && *rhs < *lhs) 
      *(dst++) = *(rhs++); 
     *(dst++) = *(lhs++); 
    } 
    while (rhs < endRhs) 
     *(dst++) = *(rhs++); 
} 

void dumpArray(int* array, size_t elements) { 
    for (size_t i = 0; i < elements; ++i) 
     std::cout << array[i] << " "; 
    std::cout << std::endl; 
} 

int main() { 
    int array1[] = { 1, 2, 3 }; 
    int array2[] = { 10, 20, 30 }; 
    int array3[] = { 1, 11, 31 }; 

    int result[6]; 

    mergeTwoArraysIntoOne(array1, array2, result, 3); 
    dumpArray(result, 6); 

    mergeTwoArraysIntoOne(array2, array1, result, 3); 
    dumpArray(result, 6); 

    mergeTwoArraysIntoOne(array1, array3, result, 3); 
    dumpArray(result, 6); 

    mergeTwoArraysIntoOne(array3, array1, result, 3); 
    dumpArray(result, 6); 

    mergeTwoArraysIntoOne(array2, array3, result, 3); 
    dumpArray(result, 6); 

    mergeTwoArraysIntoOne(array3, array2, result, 3); 
    dumpArray(result, 6); 

    return 0; 
} 

現場演示:http://ideone.com/7ODqWD

如果它只是連接起來將:

std::copy(&lhs[0], &lhs[numElements], &dst[0]); 
std::copy(&rhs[0], &rhs[numElements], &dst[numElements]);