Студопедия

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

Разделы сайта

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






  • Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • Сортировка. Здесь вы не узнаете ничего нового о 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) < =...






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.