2015-12-06 31 views
-1

我寫了這段代碼。如何合併兩個排序後的數組以在C++中形成另一個排序後的數組?

#include<iostream> 
using namespace std; 
int main() 
{int n1,n2; 
cin>>n1>>n2; 
int arr1[n1],arr2[n2]; 
for (int i=0;i<n1;i++) 
cin>>arr1[i]; 
for (int j=0;j<n2;j++) 
cin>>arr2[j]; 
int arr3[n1+n2],c1=0,c2=0,c3=0; 
while (c1<n2 & c2<n2) 
{if (arr1[c1]<=arr2[c2]) 
{arr3[c3]=arr1[c1]; 
c1++; 
c3++; 
} 
else { arr3[c3]=arr2[c2]; 
c2++; 
c3++; 
} 
while (c1<n1) 
{arr3[c3]=arr1[c1]; 
c1++; 
c3++; 
} 
while (c2<n2) 
{arr3[c3]=arr2[c2]; 
c2++; 
c3++; 
} 

} 
for (int g=0;g<n1+n2;g++) 
cout<<arr3[g]; 
return 0; 
} 

但它沒有提供所需的輸出。 當我在Java中看到相同的代碼時,它被賦予相同的算法。 這段代碼有什麼問題?

+0

什麼是輸出?你期望什麼產出呢? – Hexaholic

+0

哦,我很抱歉。 – user260674

+0

哦,我非常抱歉,我想在輸入{2,4,5}和{1,3}時獲得{1,2,3,4,5},但我獲得了{1,2,3,4}加一些垃圾值和沒有5. 其實我得到了打字錯誤。我寫了(c1 user260674

回答

0

合併兩個排序向量是相對簡單的。這是一個psuedocode示例,它將按升序採用兩個向量,並按升序合併到另一個向量中。

Input: Sorted arrays A, B 
Output: Merged array C 

while((iterator on A is valid)&&(iterator on B is valid)): 
    if (elem in A < elem in B): 
     insert elem in A into C 
     increment iterator on A 
    else: 
     insert elem in B into C 
     increment iterator on B 

while (iterator on A is valid): 
    insert element in A into C 
    increment iterator on A 
while (iterator on B is valid): 
    insert element in B into C 
    increment iterator on B 
return C 

在A和B的元素的第一循環迭代,複製的最小元素爲C,直到它們中的至少一個是耗盡。一旦我們知道我們已經處理了至少一個列表中的所有元素,我們只想將另一個列表的其餘元素複製到C中。這就是底部兩個循環所做的。

編輯:

看你的代碼位後,你的代碼的一些具體問題可能來自第一環。您正在使用按位AND而不是邏輯AND。

此外,arr3的聲明有誤。 C++只允許使用編譯時常量進行數組大小初始化。 See This post瞭解該問題的更深入的描述。

+0

我有一個打字錯誤....我錯誤地進入了(在條件上的迭代器)和(在B條件下的迭代器)。其實它編譯,所以我不明白。無論如何,我明白了。感謝您的幫助和時間。 – user260674