Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
любой алгоритм, решающий задачу сортировки быстрее, чем за O(NlogN) операций, не может работать правильно
Википедия
фраза «сложность алгоритма есть O(f(n))» означает, что с увеличением параметра n, характеризующего количество входной информации алгоритма, время работы алгоритма будет возрастать не быстрее, чем некоторая константа, умноженная на f(n)
EndUser
O большое — количество операций для завершения алгоритма. Число платформенно независимое.
Скажем, если вы тратите 1мс на операцию на своей архитектуре, то на сортировку десяти миллионов элементов массива алгоритмом O(N) вы затратите 10000000*0.001 секунд
qsort из stdlib.h обходится без неё.Сомневаюсь, что это правда, она должна использовать её для обмена двух элементов местами (размер элемента в байтах передается как параметр).
модифицировать список нельзя, только ходить по нему
Никогда не храните указатели на элементы внутри контейнеров.Просто одно из ключевых свойств списков, что операции с ним не меняют указатели на элементы.
std::sort() хочет случайный доступ к элементам сортируемой структуры (более строго: итератор должен удовлетворять требованиям random access iterator).std::deque, и то лишь при добавлении не в начало или конец, все остальные контейнеры их сохраняют.Оверхеда у такого qsort по сравнению с классическим по сути только дополнительный лишний проход по каждому сортируемому отрезку (чтобы определить его длину + на нем же сразу будем выбирать разделитель).
Первоисточник идеи неизвестен, гугл по этому поводу по большей части молчитПо запросу quicksort without stack мне гугл выдал интересную статью Quicksort without a stack, где в довольно странно выглядящей статье (1986 года) описывается очень похожий алгоритм.
std::sort(arr,arr+len,myfunction);
то вы передаете в качестве аргумента указатель на функцию, поэтому вызовы этой функции не будут заинлайнены внутри std::sort(), в отличии от вашей функции сортировки. Лучше сделайте вот так:std::sort(arr,arr+len,[](int i, int j){ return (i^5)<(j^5); });
std::sort() чуть быстрее, а с заменой на функциональный объект становится быстрее почти в два раза coliru.stacked-crooked.com/a/9dbe1c48ab675c7a. Это так, первый взгляд, нету много времени разбираться пока.Алгоритм описан на википедии (ru, en), а также в Кормене, но я немного расскажу про него, поскольку на википедии он описан настолько топорно, что я понял его суть только после сопоставления русской и английской версии (и еще пришлось заглянуть в оригинальную статью).
Сортировка на односвязном списке за O(nlogn) времени в худшем случае с O(1) дополнительной памяти