VB 20. Сортировка массивов

* Задание: Разработать приложение, которое сортирует предложенный массив целых чисел из некоторого интервала по возрастанию.

Выполнение:

  1. Рассмотрим задачу упорядочивания массива в простейшей постановке: дан числовой массив х1, …, хn, элементы которого попарно различны, требуется переставить элементы массива так, чтобы после перестановки они были упорядочены в порядке возрастания: х1< … < хn. Опишем алгоритм решения этой задачи.
  2. Используем алгоритм сортировки выбором. Суть его такова: очевидно, что первое место в массиве должен занять наименьший элемент, второе – наименьший из всех остальных элементов и т.д. Пусть x1, …, xi-1 уже получили нужные значения. Тогда определение индекса k наименьшего из xi, xi+1, … xn и перестановка xi c xk приведут к тому, что x1, …, xi будут иметь нужные значения. Составим программу для этого алгоритма.
  3. Создайте новый проект и разместите элементы управления (txtN, txtMin, txtMax, lblИсходныйМассив, lblРезультат, btnНовыйМассив, btnСортировка и btnВыход) на форме так, как показано на рисунке (рисунок). Используйте элемент GroupBox для группировки.
Сортировка массивов в Visual Basic
Форма «Сортировка массива»
  1. Установите значение для свойства Enabled кнопки btnСортировка равным False (т.о., заблокировав кнопку).
  2. Самостоятельно запрограммируйте кнопку Выход.
  3. В разделе описаний объявите динамический массив следующим образом:
Private Массив() As Integer
  1. Теперь необходимо инициализировать наш массив целыми числами из некоторого промежутка. Процедура обработки события Click для кнопки btnНовыйМассив выглядит следующим образом:
Private Sub btnНовыйМассив_Click(…) Handles btnНовыйМассив.Click
Dim n As Integer = Val(txtN.Text)
Dim a As Integer = Val(txtMin.Text)
Dim b As Integer = Val(txtMax.Text)
ReDim Массив(0 To n)
If Not n >= 1 Or b < a Then
  MsgBox("Введены ошибочные параметры массива!", MsgBoxStyle.Critical, "Ошибка!")
  Exit Sub
End If
Randomize()
For i = 1 To n
  массив(i) = Rnd() * (b - a) + a
  lblИсходныйМассив.Text = lblИсходныйМассив.Text & Массив(i)
  If i <> n Then lblИсходныйМассив.Text = lblИсходныйМассив.Text & ","
Next
btnСортировка.Enabled = True
End Sub
  1. Наконец, реализуем описанный выше алгоритм сортировки в процедуре обработки события Click для кнопки btnСортировка. Предварительно опишем функцию НомерМинимума, которая осуществляет поиск позиции минимального элемента массива:
Private Function номерМинимума(ByVal x() As Integer, ByVal m As Integer) As Integer
' номер минимума в массиве х ищется начиная с х(m)-го элемента
Dim min As Integer = x(m) 'min присваиваем сначала первый элемент массива, затем второй и т.д.
Dim NumberMin As Integer = m
Dim i As Integer
For i = m To UBound(x) ' верхний индекс массива
  If x(i) < min Then min = x(i) : NumberMin = i
Next
номерМинимума = NumberMin
End Function
  1. Теперь опишем главный фрагмент кода, который вызывает функцию поиска позиции минимума, начиная с нулевой позиции массива; затем, после выполнения функции, на нулевое место становится минимальный элемент, а функция вызывается с аргументом уже первой (а не нулевой) позиции (затем второй позиции и т.д.):
Private Sub btnСортировка_Click(…) Handles btnСортировка.Click
Dim i As Integer
Dim k As Integer
Dim t As Integer
For i = LBound(Массив) To UBound(Массив)
  k = номерМинимума(Массив, i)
  t = Массив(i)
  Массив(i) = Массив(k) 'при первом заходе в цикл на первую позицию массива ставим минимальный элемент
  Массив(k) = t
Next
For i = LBound(Массив) To UBound(Массив)
  lblРезультат.Text = lblРезультат.Text & Массив(i)
  If i <> UBound(Массив) Then lblРезультат.Text = lblРезультат.Text & ","
Next
btnСортировка.Enabled = False
End Sub

Как Вы заметили, в данном коде вместо точного указания границ массива в цикле For используются значения свойств массива LBound и UBound. В них хранится, соответственно, нижняя и верхняя граница диапазона индексов массива. Использование этих свойств в программе позволяет автоматизировать работу с массивом в случае добавления или удаления его элементов.

  1. Запустите и отладьте приложение. Вы, очевидно, заметили, что программа начинает некорректно работать при повторном нажатии на кнопку Новый массив. Для того чтобы выправить эти дефекты, создадим процедуру ОчисткаОкон:
Private Sub ОчисткаОкон()
lblИсходныйМассив.Text = ""
lblРезультат.Text = ""
btnСортировка.Enabled = False
End Sub
  1. Вызовем созданную подпрограмму в начале процедуры обработки события Click для кнопки btnНовыйМассив, а также в процедурах обработки события Change для текстовых окон txtN, txtMin и txtMax следующим образом:
Call ОчисткаОкон()
  1. Запустите и отладьте приложение.
Дополнительное задание:

Самостоятельно разработать программу для реализации алгоритма сортировки вставками. Суть этого алгоритма в следующем: просматриваются последовательно элементы массива х2, …, хn и каждый новый элемент xi вставляется на подходящее место в уже упорядоченную совокупность x1, …, xi-1. Это место определяется последовательным сравнением xi с упорядоченными элементами x1, …, xi-1. При решении этой задачи необходимо описать и использовать функцию УпорядоченнаяВставка, которая вставляет xi на подходящее место в уже упорядоченную последовательность x1, …, xi-1.

Вопросы для самоконтроля:

  1. Какие алгоритмы сортировок Вы знаете? Опишите один их них.
  2. Для чего используются свойства массива LBound и UNound?
  3. Как передать массив в процедуру в качестве параметра?

* При использовании материалов обязательна ссылка на источник: Майер С.Ф., «MS Visual Basic 2008» — Учебно-методическое пособие : Южный федеральный университет. – Ростов-на-Дону, 2017. – 92 с.