Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.23 KB | None | 0 0
  1. Лекция 3.
  2.  
  3. Сегодня вашим лектором впервые буду я, Слава Муравьев) Мою лекцию я разделю на 2 части:
  4. А) Обоснование корректности и асимптотики квиксорта (быстрой сортировки) на пальцах
  5. Б) Рассказ еще об одной сортировке, обладающей асимптотикой O(N * log(N))
  6.  
  7. Часть А.
  8.  
  9. Здесь могли бы быть строгие математические доказательства с кучей формул, но вряд ли они вам когда-нибудь пригодятся)
  10. Быстрая сортировка работает по принципу "разделяй и властвуй" - довольно известный подход к решению многих задач.
  11.  
  12. Алгоритм квиксорта состоит из двух основных частей:
  13. 1) Выбирается "опорный" элемент, и массив разбивается по следующему правилу:
  14. Все элементы, меньше или равные опорному элементу, должны иметь меньший индекс, чем опорный, а больше - больший индекс.
  15. Заметим, что мы не требуем упорядоченности элементов слева и справа от опорного, мы лишь задаем для них верхнюю/нижнюю границу.
  16. 2) Алгоритм быстрой сортировки запускается для части массива, меньшей опорного, затем - для большей.
  17.  
  18. Соответственно, выход из рекурсии мы осуществим, когда сортировать будет нечего - мы доберемся до пустого массива.
  19.  
  20. Почему это работает? Заметим, что когда мы выполним пункт 1, то пропадает необходимость в обменах элементов, меньших и больщих опорного.
  21. Следовательно, когда мы отсортируем эти две части массива, то относительно друг друга они уже будут находиться в правильном положении.
  22.  
  23. Теперь асимптотика. Каждое разбиение массива мы будем производить за O(N) - будем пробегать массив двумя указателями,
  24. один будет искать элемент, больший опорного с индексом, меньшим индекса опорного, второй - меньший опорного с большим индексом.
  25. Когда оба указателя найдут такие элементы, нам остается только переставить местами эти элементы и продолжить двигать указатели до их пересечения.
  26. В этом случае каждый указатель сделает максимум N перемещений (мы же по массиву его двигаем, к тому же только в одну сторону).
  27.  
  28. Но у нас остается вопрос - а сколько раз мы будем делать такие разбиения массива? Если посмотреть на наш алгоритм, то можно заметить, что в среднем
  29. он всегда делит массив на 2 примерно равные части, то есть длина сортируемого массива уменьшается примерно вдвое при каждом заходе в рекурсию.
  30. Максимум таких делений будет log_2(N), а на каждом уровне мы будем делать разбиения нескольких массивов, в сумме пробегая все равно целый массив длины N.
  31. Отсюда мы сделаем O(N * log(N)) операций, что и требовалось показать.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement