Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Сортировка. Здесь вы не узнаете ничего нового о Visual Basic






Здесь вы не узнаете ничего нового о Visual Basic. Будем совершенствовать технику программирования.

 

Пусть имеется ряд чисел: 8 2 5 4. Под сортировкой понимают их упорядочивание по возрастанию (2 4 5 8) или убыванию (8 5 4 2). Сортировать можно и строки (как слова в словаре).

Сортировка - очень распространенная вещь в самых разных программах, в частности - в системах управления базами данных.

 

Задача: Задан массив из 100 произвольных положительных чисел. Отсортировать его по возрастанию.

Идея решения: Если мы не можем сходу запрограммировать задачу, нужно подробно представить себе, в каком порядке мы решали бы ее вручную, без компьютера. Как бы мы сами сортировали 100 чисел? Мы бы запаслись пустым листом бумаги из 100 клеток. Затем нашли бы в исходном массиве максимальное число и записали его в самую правую клетку, а в исходном массиве на его месте записали бы число, меньшее самого маленького в массиве (в нашем случае подойдет 0). Затем нашли бы в изменившемся исходном массиве новое максимальное число и записали его на второе справа место, а на его место в исходном массиве - 0. И так далее.

Вот программа для 10 чисел:

Const N = 10 'N - размер массива

Dim massiv_ishodn(1 To N) As Integer 'Это исходный массив

Dim massiv_rezult(1 To N) As Integer 'Это наш пустой лист бумаги

 

'Вспомогательная функция для поиска максимума в массиве m(1 To N). Она выдает значение

'максимального элемента (maximum) и заодно номер этого элемента (Nomer_max):

Private Function maximum(m, N As Integer, Nomer_max As Integer) As Integer

Dim i As Integer, max As Integer

max = m(1): Nomer_max = 1 'max - " временный" максимум

For i = 2 To N

If max < m(i) Then

max = m(i)

Nomer_max = i

End If

maximum = max

Next

End Function

 

'Основная процедура сортировки исходного вектора mass_ish размера N в результирующий - mass_rez:

Private Sub sortirovka(mass_ish, N As Integer, mass_rez)

Dim Nom_max As Integer

For i = 1 To N

mass_rez(N + 1 - i) = maximum(mass_ish, N, Nom_max) 'Пишем " в правую клетку"

mass_ish(Nom_max) = 0 'Ноль - на старое место

Next

End Sub

 

Private Sub Command1_Click()

massiv_ishodn(1) = 41 'Задаем значения элементов исходного массива

massiv_ishodn(2) = 8

massiv_ishodn(3) = 17

massiv_ishodn(4) = 82

massiv_ishodn(5) = 20

massiv_ishodn(6) = 2

massiv_ishodn(7) = 30

massiv_ishodn(8) = 12

massiv_ishodn(9) = 6

massiv_ishodn(10) = 9

 

sortirovka massiv_ishodn, N, massiv_rezult 'Сортируем массив

 

For i = 1 To N

Debug.Print massiv_rezult(i); 'Распечатываем отсортированный массив

Next

End Sub

 

Функция maximum, кроме того, что сама имеет значение максимального элемента массива, выдает еще порядковый номер максимального элемента - Nomer_max. Это называется побочным эффектом функции.

 

Методов сортировки много. Приведенный метод - самый примитивный. Мало того, что нам пришлось расходовать память на второй массив, для выполнения сортировки массива из 100 элементов понадобилось бы около 100*100=10000 операций сравнения элементов массива между собой.

Существуют методы гораздо более эффективные. Приведу один из них - метод пузырька. Представьте себе тонкую вертикальную трубку с водой. Запустим снизу пузырек воздуха. Он поднимется до самого верха и остановится. Затем пустим еще один. Он поднимется наверх и остановится сразу же под первым. Затем запустим третий и так далее все сто пузырьков.

А теперь представим, что это не трубка, а наш исходный массив, а вместо пузырьков поднимаются максимальные элементы.

Вот алгоритм: Сравним первый элемент массива со вторым, и если второй больше, то ничего не делаем, а если первый больше, то меняем местами первый и второй элементы. В этом вся соль метода. Затем повторяем это со вторым и третьим элементами - если третий больше, то ничего не делаем, а если второй больше, то меняем местами второй и третий элементы. Затем повторяем все это с третьим и четвертым элементами и так далее. Где-то по пути мы встретим максимальный элемент, и он, как пузырек, поднимется у нас до самого верха.

Теперь, когда мы знаем, что элемент номер 100 у нас самый большой, нам предстоит решить задачу сортировки для массива из остальных 99 элементов. Метод тот же. Запускаем второй пузырек и так далее.

Метод пузырька не требует второго массива, да и сравнений здесь в два раза меньше.

Вот программа:

Const N = 10 'N - размер массива

Dim massiv(1 To N) As Integer 'Это массив

 

'Сортировка массива mass размером Razmer:

Private Sub puziryok(mass, Razmer As Integer)

Dim i As Integer

For m = Razmer To 2 Step -1 'Всего пузырьков - 9

For i = 1 To m - 1 'i увеличивается - пузырек ползет вверх

If mass(i) > mass(i + 1) Then 'Стоит ли обмениваться значениями

c = mass(i) 'Три оператора для обмена значений двух элементов с помощью

mass(i) = mass(i + 1) 'транзитного элемента c

mass(i + 1) = c

End If

Next i

Next m

End Sub

 

Private Sub Command1_Click()

massiv(1) = 41 'Задаем значения элементов массива

massiv(2) = 8

massiv(3) = 17

massiv(4) = 82

massiv(5) = 20

massiv(6) = 2

massiv(7) = 30

massiv(8) = 12

massiv(9) = 6

massiv(10) = 9

 

puziryok massiv, N 'Сортируем массив

 

For i = 1 To N

Debug.Print massiv(i); 'Распечатываем отсортированный массив

Next

End Sub

В заключение скажу, что существуют методы гораздо более эффективные, чем метод пузырька.

Задание 132: Отсортируйте по возрастанию двумерный массив. Я имею в виду - нужно сделать так, чтобы:

а(1, 1) < = a(1, 2) < =... < = a(1, N) < =

< = a(2, 1) < = a(2, 2) < =... < = a(2, N) < =

< = a(3, 1) < = a(3, 2) < =...


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.01 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал