- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 100
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <stdbool.h>
struct two_val
{
const int32_t a[2];
};
struct two_val_and_status
{
const bool is_swap;
const struct two_val t_v;
};
struct array
{
const int32_t a[10];
};
struct array_and_status
{
const bool is_swap;
const size_t pos;
const struct array arr;
};
// Эта суперфункцональная функция сортировки двух элементов не просто сортирует два элемента
// но и еще сообщает о том, нужно ли было для этого обменивать два значения
struct two_val_and_status sort2(const struct two_val a)
{
return (a.a[0] > a.a[1]) ? (struct two_val_and_status){true, {{a.a[1], a.a[0]}}} : (struct two_val_and_status){false, a};
}
struct two_val read_two_val(const struct array arr, const size_t pos)
{
return (struct two_val){{arr.a[pos], arr.a[pos+1]}};
}
struct array store_val(const struct array arr, const int32_t val, size_t pos)
{
return (struct array) // Царский анролл
{{
pos != 0 ? arr.a[0] : val,
pos != 1 ? arr.a[1] : val,
pos != 2 ? arr.a[2] : val,
pos != 3 ? arr.a[3] : val,
pos != 4 ? arr.a[4] : val,
pos != 5 ? arr.a[5] : val,
pos != 6 ? arr.a[6] : val,
pos != 7 ? arr.a[7] : val,
pos != 8 ? arr.a[8] : val,
pos != 9 ? arr.a[9] : val
}};
}
struct array store_two_val(const struct array arr, const struct two_val val, const size_t pos)
{
return store_val(store_val(arr,val.a[0],pos),val.a[1],pos+1);
}
// суперохуительная рекурсивная функция сортировки пузырьком
struct array_and_status bubble_sort_rec(struct array_and_status state)
{
if (state.pos == 9)
{
if (state.is_swap == false) // Ура! Сортировка пузырьком завершена!
{
return state;
}
else
{ // а иначе нам надо по-новой сортировать!
return bubble_sort_rec((struct array_and_status){.is_swap = false, .pos=0, .arr = state.arr});
}
}
else
{
const struct two_val_and_status tmp = sort2(read_two_val(state.arr, state.pos));
return bubble_sort_rec(
(struct array_and_status)
{
.is_swap = tmp.is_swap || state.is_swap,
.pos=state.pos+1,
.arr = store_two_val(state.arr, tmp.t_v, state.pos)
}
);
}
}
int main(void)
{
const struct array_and_status a = {.is_swap = false, .pos = 0, .arr = {{8,2,4,1,3,5,7,0,6,9}} };
const struct array_and_status a_sort = bubble_sort_rec(a);
for(size_t i = 0; i < 10; i++) // ох уж это убогое императивное программирование!!!
{
printf("%" PRIu32 ", ", a_sort.arr.a[i]);
}
return EXIT_SUCCESS;
}
j123123 19.12.2021 04:49 # 0
j123123 19.12.2021 04:59 # 0
gEKA6PbCKuu_nemyx 19.12.2021 08:44 # 0
bormand 19.12.2021 10:10 # +2
Мне почему-то кажется, что пузырёк самый сложный в этом плане. Очень неочевидный алгоритм.
Soul_re@ver 19.12.2021 11:30 # +4
Достаточно доказать, что после одного прохода один элемент гарантированно встанет на своё место и что при применении его на массив с одним элементом он будет отсортирован.
Дальше — индукция.
CHayT 20.12.2021 19:19 # +1
Soul_re@ver 20.12.2021 19:21 # +1
JloJle4Ka 20.12.2021 19:22 # 0
gEKA6PbCKuu_nemyx 20.12.2021 19:26 # +1
gEKA6PbCKuu_nemyx 20.12.2021 19:27 # +1
ISO 20.12.2021 19:34 # +2
guest6 20.12.2021 19:53 # +1
хуейкер
gEKA6PbCKuu_nemyx 21.12.2021 01:31 # +1
1024-- 21.12.2021 12:38 # +1
1024-- 21.12.2021 13:26 # 0
gEKA6PbCKuu_nemyx 20.12.2021 19:23 # +1
JloJle4Ka 20.12.2021 19:25 # 0
Rooster 20.12.2021 19:27 # +3
gEKA6PbCKuu_nemyx 20.12.2021 19:30 # +3
При наивном алгоритме нужно пройти n² элементов. При подрезании границы получится треугольник, т. е. в два раза меньше элементов.
Я сэкономил не байт, а половину процессорного времени.
guest6 20.12.2021 19:53 # +1
хуяйт
gEKA6PbCKuu_nemyx 20.12.2021 20:19 # +1
j123123 20.12.2021 23:00 # +2
Fike 21.12.2021 00:02 # 0
guest6 21.12.2021 00:15 # 0
bormand 21.12.2021 00:18 # 0
Хуил.
gEKA6PbCKuu_nemyx 21.12.2021 00:35 # +3
Fike 21.12.2021 00:44 # 0
Soul_re@ver 21.12.2021 00:44 # 0
Фекальный.
Fike 21.12.2021 06:35 # 0
gEKA6PbCKuu_nemyx 21.12.2021 13:32 # 0
guest6 21.12.2021 01:00 # +2
В Осседу Ксотя перводил..
gEKA6PbCKuu_nemyx 21.12.2021 01:30 # 0
guest6 21.12.2021 01:32 # 0
guest6 20.12.2021 19:34 # +1
если у тебя массив из одного миллона элементов, и ты сортируешь его сто тысяч раз в секунду, но это важно
bormand 21.12.2021 00:42 # +3
С квадратичным алгоритмом миллион так быстро не раскидать...
1024-- 21.12.2021 12:45 # +1
> или до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны
>
ttps://ru.wikipedia.org/wiki/Сортировка_пузырьком
gEKA6PbCKuu_nemyx 21.12.2021 12:56 # +2
gEKA6PbCKuu_nemyx 21.12.2021 13:10 # 0
1. Отрезаем уже отсортированный хвост.
2. Если массив уже отсортирован полностью, досрочно выходим.
Удобно для частично отсортированных массивов.
1024-- 21.12.2021 13:29 # +1
ISO 19.12.2021 11:46 # +2
Или ты про конкретное доказательство на «Coq»?
bormand 19.12.2021 12:15 # 0
Угу. Тут ещё рекурсия неопределённой длины. Придётся пруфать,что она остановится за N проходов.
CHayT 19.12.2021 18:08 # +3
Лучше применить well-founded recursion [1]. В качестве well-founded relation взять количество неупорядоченных элементов, например.
[1] http://adam.chlipala.net/cpdt/html/Cpdt.GeneralRec.html
j123123 19.12.2021 12:20 # +1
JloJle4Ka 19.12.2021 15:28 # 0
Steve_Brown 20.12.2021 11:52 # +1
А то, если забыть, можно будет просто забить выходной массив нулями и сказать "я отсортироваль"
CHayT 20.12.2021 19:53 # +1
https://coq.inria.fr/library/Coq.Sorting.Sorted.html
https://coq.inria.fr/library/Coq.Sorting.Permutation.html
gEKA6PbCKuu_nemyx 20.12.2021 19:34 # +2
CHayT 20.12.2021 19:43 # +4
guest6 20.12.2021 19:53 # 0
хуёрт
3.14159265 06.01.2022 20:47 # 0
На дешманских питух-машинах возможно.
А на царской машине с оракулом сортировка Бога гарантировано отрабатывает за O(n).
Царской машине — царский алгоритм. Питухи пишут целые томы про сортировку, дрочат на O(log N *N).
А пацаны решают задачу за O(N) простым однострочником
Soul_re@ver 06.01.2022 20:51 # +2
HoBorogHuu_nemyx 06.01.2022 20:53 # +1
bormand 06.01.2022 20:54 # +1
Floating_cockerel 06.01.2022 20:56 # +1
3.14159265 06.01.2022 20:56 # 0
> потому что у тебя массив уже в нужном порядке
Кстати я уже размышлял на эту тему
https://govnokod.ru/26433#comment526710
* Если компилятор смог доказать, что ранее отсортированный массив, во время исполнения не изменился до момента сортировки. Он будет отсортирован за O(0).
* Bead sort
bormand 19.12.2021 10:06 # +6
guest6 19.12.2021 17:08 # +1
в нем есть макросы
ISO 19.12.2021 18:06 # +3
JloJle4Ka 19.12.2021 18:46 # +1
bormand 21.12.2021 00:16 # 0
Rooster 20.12.2021 18:46 # +5
Soul_re@ver 20.12.2021 18:53 # +5
gEKA6PbCKuu_nemyx 20.12.2021 18:56 # +4
CHayT 20.12.2021 18:58 # +4
gEKA6PbCKuu_nemyx 20.12.2021 19:00 # +3
Rooster 20.12.2021 19:14 # +2
JloJle4Ka 20.12.2021 19:16 # 0
gEKA6PbCKuu_nemyx 20.12.2021 19:17 # +3
Rooster 20.12.2021 19:20 # +5
guest6 20.12.2021 19:02 # +2
guest6 20.12.2021 19:06 # +1
ObeseYoung 21.12.2021 05:58 # 0
j123123 06.01.2022 20:31 # +1
Избавился от вонючих императивных ифов, оставив лишь чисто функциональные тернарники
https://wandbox.org/permlink/BUon7nyVppRUvXYz
Floating_cockerel 06.01.2022 20:58 # 0
Напиши функцию реализующую ветвление.
bormand 06.01.2022 20:59 # 0
Floating_cockerel 06.01.2022 21:01 # 0
Напиши функцию, реализующую массив.
bormand 06.01.2022 21:37 # 0
Кстати, попадалась недавно работа, где чуваки массив (не список) на лямбда-исчислении пилили.
j123123 27.01.2022 12:37 # 0
https://web.archive.org/web/20170705090734/http://smt2012.loria.fr/paper1.pdf
Вот тут например описывается на 98 стр. такая функциональная хуй-ня
read : array × index → element
write : array × index × element → array
Т.е. функция чтения должна принимать константный массив по значению и индекс, возвращая при этом значение по индексу:
а функция записи в массив принимает на вход массив, индекс и записываемое значение, возвращает новый массив с записанной хуйней:
Притом массивы тут бесконечные, функции никаких ошибок не возвращают и никаких побочных эффектов не имеют. И как по-вашему это реализуется в Си? Очевидно, что никак, и даже во всяких там хаскелях это на самом-то деле никак не реализуется т.к. память у ЭВМ конечна. ФП это наёбка.
HoBorogHuu_nemyx 27.01.2022 13:39 # 0
Увы, «бесконечный» массив без ленивости и без генераторов не поддержать.
j123123 27.01.2022 14:05 # 0
Но это конечно недостаточно функционально.
Можно еще сделать фукнцию, которая ищет в таком связном списке "перезаписывание" и удаляет лишнее
j123123 27.01.2022 14:18 # 0
DaveMustAim 27.01.2022 16:33 # 0
bormand 27.01.2022 16:35 # 0
j123123 02.02.2022 11:59 # +1
guest6 02.02.2022 12:12 # +1
DaveMustAim 27.01.2022 16:30 # 0
Вместо нула нужно сделать undefined, получится жопаскрипт
bormand 27.01.2022 16:31 # 0
DaveMustAim 27.01.2022 16:32 # 0
Течёт ручей, бежит ручей...
HoBorogHuu_nemyx 27.01.2022 13:43 # 0
bormand 06.01.2022 21:00 # 0
Floating_cockerel 06.01.2022 21:05 # 0
HoBorogHuu_nemyx 06.01.2022 21:07 # 0
bormand 06.01.2022 21:07 # 0
j123123 06.01.2022 21:19 # +1
bormand 06.01.2022 21:22 # 0
Или я какой-то из вызовов не вижу?
j123123 06.01.2022 21:27 # 0
bormand 06.01.2022 21:29 # 0
А это уже на следующем такте.
> стек порвётся
Ну хвостовая рекурсия же, зачем тут стек? У тебя функция или останавливается и возвращает стейт или готовит новый стейт и идёт на следующий такт.
j123123 06.01.2022 21:32 # 0
Компилятор этого может не понять
j123123 06.01.2022 21:37 # 0
bormand 06.01.2022 21:39 # 0
З.Ы. Или я гоню и нельзя каждый слой сортировки параллелить внутри: 01 23 45, потом 0 12 34 5, потом 01 23 45?
j123123 06.01.2022 21:42 # 0
bormand 06.01.2022 21:46 # 0
j123123 06.01.2022 21:47 # 0
j123123 06.01.2022 22:03 # 0
bormand 06.01.2022 22:07 # 0
Но не проебутся ли нужные пузырьку свойства от такой модификации?
bormand 07.01.2022 11:30 # 0
j123123 06.01.2022 21:30 # +1