ПОНЯТНО О Visual Basic NET (том 2)

Метод пузырька


Методов сортировки много. Приведенный метод – самый примитивный. Мало того, что нам пришлось расходовать память на второй массив, нам для выполнения сортировки массива из 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
В заключение скажу, что существуют методы гораздо более эффективные, чем даже метод пузырька.
Задание 108.      
Задача для ученого-диетолога: Определить связь между ростом и весом боксеров-профессионалов. Для этого диетолог измерил рост и вес нескольких сотен боксеров и записал результаты измерений в длинную таблицу:

Фамилия
Рост
Вес
Иванов
173
71
Петров
182
93
Сидоров
169
62
Николаев
175
70
…………….
……………….
……………..

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

Фамилия
Рост
Вес
Сидоров
169
62
Николаев
175
70
Иванов
173
71
Петров
182
93

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

Содержание раздела