![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 15.03.2011
Сообщений: 272
|
![]()
На учебе давно было задание, реализовать несколько видов сортировок. Порылся в папках, нашел некоторые, решил выложить. Перепишу по возможности на другой язык.
Итак начнем. Метод пузырька Паскаль: Код:
Код:
1. Принцип "пузырька" - после каждого прохода цикла, самый "тяжелый" эл-т становится в конец списка => нет смысла проверять последние эл-ты. 2. Допустим, у нас есть массив чисел: (1,2,4,3). Чтобы его упорядочить, достаточно одного прохода, но по этому алгоритму будет 4 обхода. => нужно проверять, упорядочен ли массив, дабы избежать лишних проверок. Решается введением доп. переменной. В большинстве случаев, это ускорит работу, хотя в худшем случае замедлит, т.к. обходы будут все, но с проверками на упорядоченность. Но худших случаев не так уж много, выбирайте. 3. Допустим, есть массив чисел: ( 2,3,4,1 ). По нашему алгоритму будет 3 обхода с такими результатами: 1) (2,3,1,4) 2) (2,1,3,4) 3) (1,2,3,4) Вам не кажется, что если бы двигались справа-налево, то достаточно было бы одного обхода ? Вывод: делаем обход в две стороны. Опять же, в некоторых случаях это замелит работу. Давайте реализуем все это на практике. Нам потребуется: еще один внутренний цикл(обход в другую сторону), булевская переменная(для проверки упорядоченности), еще 2 переменные для правой и левой границы(после каждого обхода, граница смещается) Си: Код:
Код:
|
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 15.03.2011
Сообщений: 272
|
![]()
Сортировка методом прямого обмена
Тоже достаточно простая в реализации сортировка, но при этом немного быстрее пузырьковой(но не шейкерной). При каждом обходе ищется наибольший эл-т и выставляется в конец массива. Код(уже немного оптимизированный). Паскаль: Код:
Код:
Возможно, ее еще можно оптимизировать. Мне лень ![]() |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 15.03.2011
Сообщений: 272
|
![]()
Сортировка методом подсчета
Это очень быстрая сортировка, требующая дополнительной памяти. Реализовать ее можно, только зная диапазон чисел, входящих в массив(если он неизвестен, то можно пройтись по массиву в поиске максимальных). Суть такова: Создается дополнительный массив с индексами от наименьшего эл-та сортируемого массива до наибольшего. В каждый эл-т массива ar2[n] заносится кол-во эл-тов равных n. А потом в массив по порядку заносятся эл-ты. Немного непонятно? Понимаю, посмотрите лучше на код: Оговорка: для краткости, подразумеваю, что в массиве содержатся числа от 0 до 10 Си: Код:
Код:
|
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 15.03.2011
Сообщений: 272
|
![]()
На этом все. Есть еще код сортировки вставками, но она какая-то слишком уж убогая.
Потом, может быть, напишу быструю сортировку и сортировку Шелла. Или выкладывайте свои варианты. ЗЫ прошу прощения за возможные ошибки, часть кода писал "от руки" прямо тут ![]() ЗЫЫ думаю, тема будет полезна некоторым студентам, так что предлагаю модераторам прикрепить ее кверху |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сортировки | SVing | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 06.04.2012 10:31 |
Сортировки | Sunless | Помощь студентам | 0 | 04.04.2011 17:42 |
сортировки | Christi93 | Общие вопросы C/C++ | 2 | 19.12.2010 12:15 |