Our Blog

Сортировка массива в одни цикл

Для типичной реализации алгоритма сортировки массива нужно два цикла, причем, один из них вложенный. Первый цикл перебирает список Listl, и для каждого элемента выполняется цикл, в котором проверяются все элементы списка List?. Помимо этого, на каждом шаге цикла происходит сравнение. Если сосчитать количество произведенных операций, то получится очень большое число. Рассмотрим способ сократить количество сравнений в разы и упростить алгоритм. Итак, читаем статью «Сортировка массива в одни цикл»!

Можно сколько угодно биться над повышением производительности программы и достичь лишь минимальной выгоды, если алгоритм программы изначально не способен работать быстрее. Но если изменить алгоритм, производительность может вырасти в несколько раз. Рассмотрим пример. Допустим, что вам нужно отсортировать список названий городов (назовем его Listl). Для этого можно действовать по следующему алгоритму:
1. Создать новый список List2, который будет хранить отсортированные данные.
2. Взять первый элемент списка List1 и поместить его в переменную х.
3. Сравнить переменную х с очередным элементом списка List2.
4. Если х окажется меньше, то вставить его в список List2 перед сравниваемой строкой. Если нет, то перейти к сравнению со следующим элементом списка List2.
5. Выполнять шаги 3 и 4, пока х не найдет свое место. Если список List2 закончился, то значит, х больше всех элементов и его нужно вставить в конец списка.
6. Взять следующий элемент списка List1 , поместить его в переменную х и перейти к шагу 3.
Для реализации этого алгоритма нужно два цикла, причем, один из них вложенный. Первый цикл перебирает список Listl, и для каждого элемента выполняется цикл, в котором проверяются все элементы списка List?. Помимо этого, на каждом шаге цикла происходит сравнение. Если сосчитать количество произведенных операций, то получится очень большое число. К тому же, сам алгоритм прост только на первый взгляд. На самом деле, для его реализации нужно достаточно сильно постараться и при этом не ошибиться, а здесь достаточно мест, где можно допустить ошибку. Можно как-то попытаться увеличить скорость операций сравнения, но тут у нас слишком ограничены возможности. Если у самого процессора есть несколько способов сравнить два числа, то у РНР их можно пересчитать по пальцам одной руки.
А теперь представим, что этот алгоритм должен отсортировать следующую последовательность чисел: 1, 2, 3, 4, 5, 6, 8, 7, 9. В этой последовательности достаточно поменять только числа 8 и 7 местами, но наш алгоритм этого не знает, поэтому будет выполняться очень долго. А если массив уже отсортирован? Тяжелая работа интерпретатора и процессора окажутся напрасными. Замена алгоритма на что-то более совершенное позволит ускорить работу в несколько раз. В данном случае не совсем корректно выбран пример, потому что для сортировки существует великое множество разных вариантов алгоритмов, и каждый из них при определенных условиях может работать быстрее других.
Но мы рассмотрим один из вариантов, который может реально повысить скорость работы:
1. Помещаем первый элемент в переменную х.
2. Устанавливаем флаг состояния в значение false.
3. Следующий компонент помещаем в переменную У.
4. Сравниваем переменные. Если X>Y, то меняем их в списке местами и устанавливаем флаг состояния в значение true. Иначе записываем в х значение Y.
5. Если просмотр не закончен, то перейти к шагу 2.
6. Если просмотр закончен, то проверить переменную состояния. Если она равна true, то во время проверки элементы менялись местами, и нужно повторить прогон сначала. Если состояние равно false, то повтор не нужен, все элементы отсортированы.
Возвращаемся к примеру последовательности, в которой нужно только поменять местами два элемента. При новом алгоритме нужно будет только два раза просмотреть весь список. На первом шаге цифры 7 и 8 поменяются местами, а после второго просмотра списка программа увидит, что изменений не было, а значит, список отсортирован.
Этот алгоритм нуждается только в одном цикле, который будет выполняться намного меньше раз, если данные более-менее упорядочены. Но даже при максимальном перемешивании скорость работы этого алгоритма выше, чем у рассмотренного первым. Как видите, очень важно правильно выбрать алгоритм. Если окажется, что ваш сценарий работает слишком медленно, я рекомендую уничтожить его и начать писать с чистого листа. Как я уже сказал, в РНР это очень важно, потому что нет возможности обращаться к процессору напрямую и использовать его преимущества. Разработчики РНР создавали интерпретатор максимально универсальным, поэтому и сами не очень часто оптимизировали код под конкретную архитектуру. А ведь если знать, что программа точно будет работать на Pentium 4, то можно было бы использовать новые возможности этой архитектуры, технологию Hyper Threading и новые инструкции процессора, что значительно повысит скорость работы программы даже при медленных алгоритмах. Большинство программ так или иначе использует математические алгоритмы, поэтому для написания эффективных программ вы должны хорошо разбираться в математике. Например, математические алгоритмы применяются при сортировке.

Comments ( 0 )
    -->