Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2016, 10:59   #1
Fyn
 
Регистрация: 26.11.2016
Сообщений: 7
Восклицание Сортировка «демоном Максвелла» [Язык Си]

Может кто-нибудь на примере кода объяснить сортировку «демоном Максвелла», заранее благодарю.
Тут описана сортировка «демоном Максвелла»---->https://habrahabr.ru/post/161835/
Fyn вне форума Ответить с цитированием
Старый 05.12.2018, 14:13   #2
Николай Соленый
Новичок
Джуниор
 
Регистрация: 05.12.2018
Сообщений: 1
По умолчанию Когда я не нашел ни одного адекватного поста на эту тему, и тут ваш вопрос без ответа, я подумал что началась всемирная ядерная война а все программисты стали зомби

http://algolab.valemak.com/maxwell-demon
здесь человек пишет что его сложность
O(n! + [n/2]! + [n/4]! + [n/8]! + ... + 1!)
то есть он вообще не думоит

https://habr.com/post/161835/
также не ясно почему этот алгоритм оказался в этой шуточной статье

между тем не существует ни одного поста в знакомом мне интернете,
где его хоть как-то попытались реализовать (люди пишут что хотят, а эксперимент не проводят).

да даже в лабораторке задание вон с 2мя ошибками(jpg файл)

Я, должно быть поздновато вам отвечаю на вопрос, но вы просто знайте, что алгоритм неплох тем, что просто пишется и запоминается, не требователен к памяти (O(n)) и сложность по времени близка к O(n*log2n)

Если хотите напишите другую шуточную статью на хабре о человеческой предвзятости и глупости. Только, ради бога, не указывайте меня соавтором. Даже если я первый в мире человек, выполнивший этот вариант лабораторки.

Завтра пойду смотреть в круглые глаза препода. Потому что он, когда копипастил задачу, наверное тоже думал что это еще один богосорт.

void DMaxwell(int *arr, int len) {
if(len == 1)
return;
if(len == 2) {
if(arr[0]>arr[1]) len=arr[0], arr[0]=arr[1], arr[1]=len;
return;
}

int *dat = malloc(4*len),
lb = 0, rb = len-1,
lmax = arr[0], rmin = arr[len/2];

for(int i = 0; i < len/2; i++)
if(arr[i] > lmax)
lmax = arr[i];
for(int i = len/2; i < len; i++)
if(arr[i] < rmin)
rmin = arr[i];

while(rmin<lmax) {
lb = 0, rb = len-1;

for(int i = 0; i < len/2; i++)
if(arr[i] <= rmin) dat[lb++] = arr[i];
else dat[rb--] = arr[i];
for(int i = len/2; i < len; i++)
if(arr[i] > lmax) dat[rb--] = arr[i];
else dat[lb++] = arr[i];

for(int i = 0; i < len; i++)
arr[i] = dat[i];

lmax = arr[0], rmin = arr[len/2];
for(int i = 0; i < len/2; i++)
if(arr[i] > lmax)
lmax = arr[i];
for(int i = len/2; i < len; i++)
if(arr[i] < rmin)
rmin = arr[i];
}
free(dat);
DMaxwell(arr, len/2);
DMaxwell(arr+len/2, len/2+len%2);
}
Изображения
Тип файла: jpg Задача8.jpg (105.5 Кб, 141 просмотров)
Вложения
Тип файла: xlsx var8.xlsx (20.8 Кб, 35 просмотров)
Николай Соленый вне форума Ответить с цитированием
Старый 12.12.2018, 11:35   #3
Cryoto
Новичок
Джуниор
 
Регистрация: 12.12.2018
Сообщений: 1
Печаль Не определяет функцию malloc

Цитата:
Сообщение от Николай Соленый Посмотреть сообщение
http://algolab.valemak.com/maxwell-demon
здесь человек пишет что его сложность
O(n! + [n/2]! + [n/4]! + [n/8]! + ... + 1!)
то есть он вообще не думоит

https://habr.com/post/161835/
также не ясно почему этот алгоритм оказался в этой шуточной статье

между тем не существует ни одного поста в знакомом мне интернете,
где его хоть как-то попытались реализовать (люди пишут что хотят, а эксперимент не проводят).

да даже в лабораторке задание вон с 2мя ошибками(jpg файл)

Я, должно быть поздновато вам отвечаю на вопрос, но вы просто знайте, что алгоритм неплох тем, что просто пишется и запоминается, не требователен к памяти (O(n)) и сложность по времени близка к O(n*log2n)

Если хотите напишите другую шуточную статью на хабре о человеческой предвзятости и глупости. Только, ради бога, не указывайте меня соавтором. Даже если я первый в мире человек, выполнивший этот вариант лабораторки.

Завтра пойду смотреть в круглые глаза препода. Потому что он, когда копипастил задачу, наверное тоже думал что это еще один богосорт.

void DMaxwell(int *arr, int len) {
if(len == 1)
return;
if(len == 2) {
if(arr[0]>arr[1]) len=arr[0], arr[0]=arr[1], arr[1]=len;
return;
}

int *dat = malloc(4*len),
lb = 0, rb = len-1,
lmax = arr[0], rmin = arr[len/2];

for(int i = 0; i < len/2; i++)
if(arr[i] > lmax)
lmax = arr[i];
for(int i = len/2; i < len; i++)
if(arr[i] < rmin)
rmin = arr[i];

while(rmin<lmax) {
lb = 0, rb = len-1;

for(int i = 0; i < len/2; i++)
if(arr[i] <= rmin) dat[lb++] = arr[i];
else dat[rb--] = arr[i];
for(int i = len/2; i < len; i++)
if(arr[i] > lmax) dat[rb--] = arr[i];
else dat[lb++] = arr[i];

for(int i = 0; i < len; i++)
arr[i] = dat[i];

lmax = arr[0], rmin = arr[len/2];
for(int i = 0; i < len/2; i++)
if(arr[i] > lmax)
lmax = arr[i];
for(int i = len/2; i < len; i++)
if(arr[i] < rmin)
rmin = arr[i];
}
free(dat);
DMaxwell(arr, len/2);
DMaxwell(arr+len/2, len/2+len%2);
}
Проблема, которую необходимо решить, но я бессилен. Почему-то malloc требует тип void* и не хочет переобразовываться в int*
Изображения
Тип файла: jpg Снимок.jpg (79.4 Кб, 133 просмотров)
Cryoto вне форума Ответить с цитированием
Старый 12.12.2018, 11:48   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Не требует, а возвращает. Не почему-то, а потому что это "указатель на все". Сделайте приведение типов или раз уж пишите на С++ используйте new.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уравнение Максвелла. Smitt&Wesson Свободное общение 1 16.12.2013 22:16
Интеграл от функции распределения Максвелла Virus1 C# (си шарп) 0 18.11.2012 20:05
Распределение Максвелла в TASM Ispotiq Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 10.05.2010 16:40
Daemon или как заключить сделку с демоном Dj_smart PHP 13 04.10.2008 00:07