Сортировка - VB (170523)

Формулировка задачи:

Помогите пожалуйста решить задание Пусть даны две неубывающие последовательности действительных чисел a1 ≤ a2 ≤ ... ≤ аn и b1 ≤ b2 ≤ ... ≤ bm. Требуется указать те места, на которые нужно вставлять элементы последовательности b1, b2, ..., bm в первую последовательность так, чтобы новая последовательность оставалась возрастающей.

Код к задаче: «Сортировка - VB (170523)»

textual
Function merge(A() As Integer, B() As Integer) As Integer()
 
Dim R() As Integer ' здесь будет результат    'имя, оканчивающееся на %, означает, что соотв. переменная    'имеет тип integer    na% = UBound(A, 1)  ' размер 1-го массива    nb% = UBound(B, 1)  ' размер 2-го массива    ReDim R(1 To na% + nb%) As Integer ' выделяем память под рез.    ia% = 1 ' индекс первого сливаемого    ib% = 1 ' индекс второго сливаемого    ir% = 1 ' индекс результат    Do
       If ia% > na% And ib% > nb% Then Exit Do ' если оба массива исчерпаны - выход       If ia% > na% Then  ' если исчерпан первый, а второй - еще нет          For j% = ib% To nb%  ' сброс остатка второго в хвост результата              R(ir%) = B(j%)
              ir% = ir% + 1
          Next j%
          Exit Do  ' выход из цикла       End If
       If ib% > nb% Then ' если исчерпан второй, а первый - еще нет          For j% = ia% To na% ' сброс остатка первого в хвост результата              R(ir%) = A(j%)
              ir% = ir% + 1
          Next j%
          Exit Do ' выход из цикла       End If
       If A(ia%) > B(ib%) Then  ' если оч. элемент первого больше эл-та второго          R(ir%) = B(ib%)  ' сбрасываем второй; первый не трогаем          ib% = ib% + 1
          ir% = ir% + 1
       ElseIf A(ia%) = B(ib%) Then  'если элементы равны - сбрасываем оба          R(ir%) = A(ia%)
          ia% = ia% + 1
          ir% = ir% + 1
          R(ir%) = B(ib%)
          ir% = ir% + 1
          ib% = ib% + 1
       Else ' если оч. элемент второго больше эл-та первого          R(ir%) = A(ia%) ' сбрасываем первый; второй не трогаем          ia% = ia% + 1
          ir% = ir% + 1
       End If
    Loop
    merge = R  ' возврат массива
End Function
 
Sub TestM()
Dim X(1 To 3) As Integer
Dim Y(1 To 5) As Integer
Dim Z()       As Integer
    X(1) = 0
    X(2) = 10
    X(3) = 60
    Y(1) = 1
    Y(2) = 2
    Y(3) = 33
    Y(4) = 44
    Y(5) = 55
    Z = merge(X, Y)
    For i% = 1 To 8
        Debug.Print Z(i%)
    Next i%
End Sub

12   голосов, оценка 4.250 из 5


СОХРАНИТЬ ССЫЛКУ