2016-03-08 66 views
0

我想知道如何讓這段代碼更好。我不能得到它來按升序排列聯合數組而不操縱其他2個數組。麻煩協助給定2個一維數組,按升序排序。寫一個程序,將它們合併成一個單一的排序數組,按升序排列

解決方案: 模塊模塊1

Sub Main() 
    Dim a() As Integer = {2, 4, 1, 5, 0, 3} 
    Dim B() As Integer = {10, 8, 6, 9, 7} 
    Dim value = A.Union(B) 

    Console.WriteLine("Set A") 
    Array.Sort(A) 
    For Each srt As Integer In a 
     Console.WriteLine("{0}", srt) 
    Next 
    Console.WriteLine("set B") 
    Array.Sort(B) 
    For Each srt As Integer In B 
     Console.WriteLine("{0}", srt) 

    Next 
    Console.WriteLine("Joining") 
    For Each c As Integer In value 
     Console.WriteLine(c) 
    Next c 
    Console.ReadKey() 
End Sub 

前端模塊

+0

那究竟是什麼問題呢? – Mureinik

+0

如果我要從他們的數組中切換說3和7,聯合數組將不會按升序排序,或者如果我在這兩個數組中都放置隨機數,結果將不會被排序 – snash

+0

「聯合」執行某種排序嗎?據我的理解,輸出不會被排序。 – Codor

回答

1

我的理解,合併在線性時間兩個已排序的陣列的任務可以通過迭代地決定從哪個數組的值是做要採取。我沒有使用Visual Basic的經驗,但可以用一些C#僞代碼解釋這個想法。

int[] A; // first sorted array 
int[] B; // second sorted array 
int[] C = new int[A.length + B.length]; // will contain the result; 

int ia = 0; // index for A 
int ib = 0; // index for B 
int ic = 0; // index for C 

while (ic < c.length) // iterate while C is not filled 
{ 
    if (ia == A.length) // A is consumed, must take from B 
    { 
     C[ic] = B[ib]; 
     ib = ib + 1; 
    } 
    else if (ib == B.length) // B is consumed, must take from A 
    { 
     C[ic] = A[ia]; 
     ia = ia + 1; 
    } 
    else // neither A nor B is consumed, must make real comparison 
    { 
     if (A[ia] < B[ib]) // take from A 
     { 
      C[ic] = A[ia]; 
      ia = ia + 1; 
     } 
     else // take from B 
     { 
      C[ic] = B[ib]; 
      ib = ib + 1; 
     } 
    } 
    ic = ic + 1; // step forward in C 
}