- 1
https://pastebin.com/ABfdEgS5
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
https://pastebin.com/ABfdEgS5
Выкладываю не глядя мой код примерно 12-го года.
gostinho 10.02.2020 23:55 # 0
vistefan 11.02.2020 00:08 # 0
HoBorogHuu_nemyx 11.02.2020 09:21 # +1
guest8 11.02.2020 00:47 # −999
1024-- 11.02.2020 19:07 # 0
Я помню, что в школе писал его так же, ну и на будущее после школы запомню. Стабильно квадратичный питух.
А вот в Википедии в качестве питузырька указан вариант, который питуроверяет массив на питузованность, из-за чего вовремя останавливается и выдаёт линейную питушню в некоторых случаях.
Какой питузырёк правильный? На Википедии расширенный неканон, или в школе изучаем зауженный никанон?
guest8 11.02.2020 19:18 # −999
1024-- 12.02.2020 08:59 # 0
3.14159265 13.02.2020 22:17 # +1
Рекурсивный, им. Хоара.
gost 13.02.2020 22:19 # +2
1024-- 14.02.2020 00:18 # 0
* Может переполнить стек
* В лучшем случае логарифм, когда у википитузырька - линия
* По памяти питушня (линия же?), когда у википитузырька - константа
* Худший случай - квадрат что там, что там
1024-- 14.02.2020 00:22 # +2
Питузырёк с вики его отпитузырит за линию (теоретический пердел).
Рекококорсивный питузырёк его отпитузырит за кваквадрат!
Какой анскил )))
gost 14.02.2020 00:30 # +2
А вот и не очевидно:
Именно поэтому я за «Python».
gostinho 14.02.2020 00:40 # +1
Именно поэтому я за "R".
DypHuu_niBEHb 14.02.2020 00:47 # 0
3.14159265 14.02.2020 00:53 # +1
Там кстати Timsort, который ищет частично отсортированные куски.
Потому я тоже за «Python».
KpunoBblu_nemyx 14.02.2020 01:48 # 0
3.14159265 14.02.2020 00:48 # +1
Потому я за while(!sorted(array)) shuffle(array);
1024-- 14.02.2020 01:16 # +1
gost 14.02.2020 01:29 # 0
3.14159265 14.02.2020 01:54 # +1
>Bogosort
А это сортировка Бога.
3.14159265 14.02.2020 01:13 # 0
Тоже кстати неочевидно.
Думаю предел O(1).
gost 14.02.2020 01:17 # 0
1024-- 14.02.2020 01:25 # 0
sorted([1,1,1,1,...,1]) - O(N)
sorted({data: [1,1,1,1,...,1], sorted: true}) - O(N)
3.14159265 14.02.2020 01:27 # 0
То есть он отсортирован.
То есть возможен O(1).
gost 14.02.2020 01:31 # 0
3.14159265 14.02.2020 03:06 # +1
Забавную дрянь нашёл. Многопоточную
gost 14.02.2020 10:55 # +1
KpunoBblu_nemyx 14.02.2020 01:51 # 0
1024-- 14.02.2020 01:18 # 0
Но в общем случае алгоритм не обладает такими знаниями, если только не использовать зожатые массивы, для которых повторяющиеся питухи будут сворачиваться.
3.14159265 14.02.2020 01:23 # 0
А когда призываем sort проверить его, если asc то возвращаем исходный массив, если desc возвращаем ленивый список наоборот. Тогда best-case будет O(1).
Ещё вариант, если у нас параллельная вычислительная машина (какая-то квантовая питушня). Тогда тоже можно проверить за константое время отсортирован ли массив.
gost 14.02.2020 01:25 # 0
3.14159265 14.02.2020 01:30 # 0
Если компилятор крайне умён он вообще выкинет sort.
gost 14.02.2020 01:33 # 0
3.14159265 14.02.2020 01:34 # +2
Сортировка за O(0)
gost 14.02.2020 01:42 # 0
3.14159265 14.02.2020 01:47 # 0
То он легко и непринуждённо применит алгоритм моментальной сортировки.
gost 14.02.2020 02:10 # 0
Временна́я сложность функции — это количество элементарных операций, которые будут выполнены этой функцией при её вызове для каких-то входных данных. То есть, если мы хотим измерить временну́ю сложность некой функции, то нам необходимо посчитать количество элементарных операций, выполняемых этой функцией.
Любые оптимизации любых компиляторов основываются на генерации эквивалентного кода. Компилятор считает две программы эквивалентными, если эквивалентно их наблюдаемое поведение (в терминах сишки и крестов — «observable behavior»).
Таким образом, для задачи измерения временно́й сложности некой функции, количество выполняемых элементарных операций становится наблюдаемым поведением. Однако ни один оптимизирующий компилятор не вносит это количество в наблюдаемое поведение. Следовательно, для задачи измерения временно́й сложности функции любой оптимизирующий компилятор генерирует неэквивалентный код, а потому любые рассуждения о сложности исходных функций на основе анализа скомпилированного кода некорректны.
guest8 14.02.2020 02:13 # −999
3.14159265 14.02.2020 02:15 # +2
Я когда-то использовал и такой алгоритм.
Установка свойства это же O(1)
guest8 14.02.2020 02:18 # −999
gost 14.02.2020 02:31 # +1
Кстати, приведу реальный пример некорректности оценки сложности по скомпилированному коду. Возьмём такую питушню:
Если мы сконпелируем её с «-O0» — мы получим функцию, которая выполняется за время O(b). Если возьмём хороший конпелятор и поставим «-O3» — получим функцию со сложность O(1): https://gcc.godbolt.org/z/3zpFqD.
Но ведь это совершенно не значит, что наш питушарский алгоритм внезапно меняет сложность с линейной на константную! Он как жрал O(b), так и продолжает жрать O(b) элементарных операций языка «C».
А конпелятор — молодец, конечно.
guest8 14.02.2020 02:38 # −999
guest8 14.02.2020 01:26 # −999
3.14159265 14.02.2020 01:31 # +1
Её в любом случае придётся делать, согласно логике программы.
3.14159265 14.02.2020 00:49 # 0
Шутка про quicksort очевидно не была понята.
Но я квадрата там в упор не вижу. Будет N*logN
gost 14.02.2020 00:58 # 0
3.14159265 14.02.2020 00:59 # 0
Он же идеально поровну разделит куски.
На [1,1,1,1,1,1,1,...,1] будет фактически best-case.
gost 14.02.2020 01:14 # +1
А если брать центральный элемент в качестве опорного — тогда да, будет идеальный NlogN (а квадрат образуется для очень хитро сформированных массивов — таких, что на каждой итерации будет выбираться минимальный/максимальный элемент).
3.14159265 14.02.2020 01:18 # +1
Да.
>стёб над worst-case квиксорта )))
Изначально всё было правильно понятно. Ну и с практической точки зрения лучший пузырёк, это именно quicksort.
1024-- 14.02.2020 01:32 # 0
Если питушить по (<), (>=) или по (<=), (>), какую из единиц в качестве пива ни возьми, он пропитушит все единицы в один бок от неё (линия) и пойдёт питушить массив единиц без одной (линия раз по убывающей линии), в результате чего получится треугольная сложность как раз как у питузырька.
3.14159265 14.02.2020 01:41 # +2
Я хотел сказать что зависит от реализации.
Кстати вот quicksort (с википедии!), который отсортирует [1,1,1,1,1,1,1,...,1] за O(N)
gost 14.02.2020 01:47 # +1
guest8 14.02.2020 01:49 # −999
1024-- 14.02.2020 01:57 # 0
Так там же просто за счёт наличия этих питушень происходит эта питушня. А можно было и внутри массива всё заменить.
3.14159265 14.02.2020 01:50 # 0
А оно будет их постоянно ресайзить ибо ArrayList<Integer>() по дефолту 10 элементов.
А вот насчёт автобоксинга в inta Integer, это фигня просто константа у O(N) будет больше. Это ж джава.
1024-- 14.02.2020 01:52 # 0
> пополам бьёт (start+end)/2
Питушня какая-то. Это число адекватно только когда элемент с таким номером - медианный.
3.14159265 14.02.2020 01:56 # 0
Не совсем.
[1,2,3,4,5,6...]
Царский пузырёк и сортировка Бога O(N), а qsort O(N*logN).
guest8 14.02.2020 01:58 # −999
1024-- 14.02.2020 02:00 # 0
И ещё по памяти жрёт дофига.
А если попробовать сэкономить память и применять питушню Хоара для инплейсного питушения, чтобы не плодить временные питушни для хранения подпитушень сортируемой питушни, то сложность возрастёт до квадрата!
guest8 14.02.2020 02:22 # −999
3.14159265 14.02.2020 02:28 # 0
https://govnokod.ru/26433#comment526688
Кстати это моя любимая сортировка, поскольку она одновременно и самая тормозная и самая быстрая.
guest8 14.02.2020 02:29 # −999
gost 14.02.2020 02:32 # +1
guest8 14.02.2020 02:44 # −999
gostinho 14.02.2020 00:28 # 0
gost 14.02.2020 00:32 # 0
guest8 14.02.2020 01:48 # −999
betking1 19.07.2021 12:40 # 0
guest6 19.07.2021 12:43 # 0