Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Понятно о Visual Basic.NET. Самоучитель.Ч2.2005...docx
Скачиваний:
81
Добавлен:
25.11.2019
Размер:
4.02 Mб
Скачать
      1. Метод пузырька

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

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

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

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

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

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

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

'Сортировка массива mass размером N+1:

Sub puziryok(ByVal mass() As Integer, ByVal N As Integer)

Dim i, c, m As Integer

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

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

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

c = mass(i) 'Три оператора для обмена значений

mass(i) = mass(i + 1) 'двух элементов с помощью

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

End If

Next i

Next m

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim massiv() As Integer = {41, 8, 17, 82, 20, 2, 30, 12, 6, 9} 'Это массив

Dim N As Integer = massiv.Length - 1 'Это его размер без 1

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

Dim i As Integer

For i = 0 To N

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

Next

End Sub

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

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

Фамилия

Рост

Вес

Иванов

173

71

Петров

182

93

Сидоров

169

62

Николаев

175

70

…………….

……………….

……………..

Для более наглядного представления о характере связи между ростом и весом необходимо упорядочить эту таблицу по весу:

Фамилия

Рост

Вес

Сидоров

169

62

Николаев

175

70

Иванов

173

71

Петров

182

93

Для проведения упорядочивания приглашается программист, то есть вы. Считайте, что вам заданы три исходных массива.