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

Узнай цену своей работы

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

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

Решение задачи: «Сортировка»

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.25 из 5