русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Сортировка


Дата добавления: 2015-06-12; просмотров: 516; Нарушение авторских прав


Здесь вы не узнаете ничего нового о 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) <= ...



<== предыдущая лекция | следующая лекция ==>
End Function | Глава 18. Проект, который выглядит солидно


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.