Рассмотрим задачу упорядочивания массива в простейшей постановке: дан числовой массив х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