Рассмотрим задачу упорядочивания массива в простейшей постановке: дан числовой массив х1, …, хn, элементы которого попарно различны, требуется переставить элементы массива так, чтобы после перестановки они были упорядочены в порядке возрастания: х1< … < хn. Опишем алгоритм решения этой задачи.
Используем алгоритм сортировки выбором. Суть его такова: очевидно, что первое место в массиве должен занять наименьший элемент, второе – наименьший из всех остальных элементов и т.д. Пусть x1, …, xi-1 уже получили нужные значения. Тогда определение индекса k наименьшего из xi, xi+1, … xn и перестановка xi c xk приведут к тому, что x1, …, xi будут иметь нужные значения. Составим программу для этого алгоритма.
Создайте новый проект и разместите элементы управления (txtN, txtMin, txtMax, lblИсходныйМассив, lblРезультат, btnНовыйМассив, btnСортировка и btnВыход) на форме так, как показано на рисунке (рисунок). Используйте элемент GroupBox для группировки.
Установите значение для свойства Enabled кнопки btnСортировка равным False (т.о., заблокировав кнопку).
Самостоятельно запрограммируйте кнопку Выход.
В разделе описаний объявите динамический массив следующим образом:
Private Массив() AsInteger
Private Массив() As Integer
Теперь необходимо инициализировать наш массив целыми числами из некоторого промежутка. Процедура обработки события Click для кнопки btnНовыйМассив выглядит следующим образом:
PrivateSub btnНовыйМассив_Click(…) Handles btnНовыйМассив.Click
Dim n AsInteger = Val(txtN.Text)
Dim a AsInteger = Val(txtMin.Text)
Dim b AsInteger = Val(txtMax.Text)
ReDim Массив(0 To n)
IfNot n >= 1 Or b < a Then
MsgBox("Введены ошибочные параметры массива!", MsgBoxStyle.Critical, "Ошибка!")
ExitSubEndIf
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 = TrueEndSub
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
Наконец, реализуем описанный выше алгоритм сортировки в процедуре обработки события Click для кнопки btnСортировка. Предварительно опишем функцию НомерМинимума, которая осуществляет поиск позиции минимального элемента массива:
PrivateFunction номерМинимума(ByVal x() AsInteger, ByVal m AsInteger) AsInteger' номер минимума в массиве х ищется начиная с х(m)-го элементаDim min AsInteger = x(m) 'min присваиваем сначала первый элемент массива, затем второй и т.д.Dim NumberMin AsInteger = m
Dim i AsIntegerFor i = m ToUBound(x) ' верхний индекс массиваIf x(i) < min Then min = x(i) : NumberMin = i
Next
номерМинимума = NumberMin
EndFunction
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
Теперь опишем главный фрагмент кода, который вызывает функцию поиска позиции минимума, начиная с нулевой позиции массива; затем, после выполнения функции, на нулевое место становится минимальный элемент, а функция вызывается с аргументом уже первой (а не нулевой) позиции (затем второй позиции и т.д.):
PrivateSub btnСортировка_Click(…) Handles btnСортировка.Click
Dim i AsIntegerDim k AsIntegerDim t AsIntegerFor i = LBound(Массив) ToUBound(Массив)
k = номерМинимума(Массив, i)
t = Массив(i)
Массив(i) = Массив(k) 'при первом заходе в цикл на первую позицию массива ставим минимальный элемент
Массив(k) = t
NextFor i = LBound(Массив) ToUBound(Массив)
lblРезультат.Text = lblРезультат.Text & Массив(i)
If i <> UBound(Массив) Then lblРезультат.Text = lblРезультат.Text & ","Next
btnСортировка.Enabled = FalseEndSub
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. В них хранится, соответственно, нижняя и верхняя граница диапазона индексов массива. Использование этих свойств в программе позволяет автоматизировать работу с массивом в случае добавления или удаления его элементов.
Запустите и отладьте приложение. Вы, очевидно, заметили, что программа начинает некорректно работать при повторном нажатии на кнопку Новый массив. Для того чтобы выправить эти дефекты, создадим процедуру ОчисткаОкон:
Private Sub ОчисткаОкон()
lblИсходныйМассив.Text = ""
lblРезультат.Text = ""
btnСортировка.Enabled = False
End Sub
Вызовем созданную подпрограмму в начале процедуры обработки события Click для кнопки btnНовыйМассив, а также в процедурах обработки события Change для текстовых окон txtN, txtMin и txtMax следующим образом:
Call ОчисткаОкон()
Call ОчисткаОкон()
Запустите и отладьте приложение.
Дополнительное задание:
Самостоятельно разработать программу для реализации алгоритма сортировки вставками. Суть этого алгоритма в следующем: просматриваются последовательно элементы массива х2, …, хn и каждый новый элемент xi вставляется на подходящее место в уже упорядоченную совокупность x1, …, xi-1. Это место определяется последовательным сравнением xiс упорядоченными элементами x1, …, xi-1. При решении этой задачи необходимо описать и использовать функцию УпорядоченнаяВставка, которая вставляет xiна подходящее место в уже упорядоченную последовательность x1, …, xi-1.
Вопросы для самоконтроля:
Какие алгоритмы сортировок Вы знаете? Опишите один их них.
Для чего используются свойства массива LBound и UNound?
Как передать массив в процедуру в качестве параметра?
* При использовании материалов обязательна ссылка на источник: Майер С.Ф., «MS Visual Basic 2008» — Учебно-методическое пособие : Южный федеральный университет. – Ростов-на-Дону, 2017. – 92 с.
Все права защищены. Использование любых материалов сайта возможно только с разрешения правообладателя. По вопросам размещения рекламы на сайте - обращайтесь: mayersvetlana @ yandex.ru