-
>Jeer © (03.04.17 21:59)
for (int i = 0; i < rnd.Length; i++) if (rnd[i] % 2 == 0) rnd[i] = rnd[i] * (-1); Array.Sort(rnd); for (int i = 0; i < rnd.Length; i++) if (rnd[i] % 2 == 0) rnd[i] = rnd[i] * (-1);
-
> Kerk © (04.04.17 12:56) [19] >> dmk © (04.04.17 12:07) [18]>> С оптимизацией 64 бита - 8 секунд. Подумаю еще над оптимизацией. > А смысл? Неужто есть надежда сделать быстрее квиксорта? Разумеется, можно. RadixSort в несколько раз быстрее, например, см. http://guildalfa.ru/alsha/node/21
-
> Сергей Суровцев © (04.04.17 13:21) [20]
Оригинально :)
-
>Kerk © (04.04.17 14:00) [22] Главное - мгновенно и не зависит от ЯП.
-
> Сергей Суровцев © (04.04.17 14:15) [23]
Мне нравится. Но целых три строки, забракуют твое решение :)
-
>Kerk © (04.04.17 14:29) [24] >Но целых три строки, забракуют твое решение :) Ну реально, то строк две. ))
Зато: >Требования: простота, изящность, самодокументируемость кода для понимания студентами. >Бонусом - эффективность исполнения (быстродействие).
-
На самом деле студенту повезло, что препод дает такие задачи, хоть тутошнему большинству они и кажутся детскими.
В последнее время все чаще приходится видеть студентов, которые поменять 0 на 1 и обратно в один оператор без if не умеют.
А задачу замены 0->1->2->0 по кругу и задать-то некому )
-
> Сергей Суровцев © (04.04.17 14:51) [25] > > >Kerk © (04.04.17 14:29) [24] > >Но целых три строки, забракуют твое решение :) > Ну реально, то строк две. ))
Я все думаю как бы так записать код, чтобы избежать дублирования строк. Они же реально одинаковые. Но пока не придумал.
-
>Неужто есть надежда сделать быстрее квиксорта? Всегда удивлялся таким вопросам. Его надо Джону Кармаку задать. Он будет на вас долго удивляться. Возможно зависнет ;)
-
Не знал, что он тоже писал гору мутного ассемблерного кода, чтобы получить нечто на пару порядков медленнее банальных библиотечных реализаций.
Тупой как пробка код из [12] сортирует 100000 элементов за 0.12 секунды Крутой ассемблерный код из [13] сортирует 100000 элементов за 18.5 секунды
Запускал на одном и том же ноутбуке для чистоты сравнения. Чтобы быть как Кармак, нужно думать как Кармак. А Кармак думает о практической необходимости и эффективности.
Ничего личного.
-
Я правильно понял, что по сути [13] - это по сути три сортировки пузырьком?
-
> Сергей Суровцев © (04.04.17 13:21) [20]
Не нашла в условии пункта, что исходный массив ПОЛОЖИТЕЛЬНЫХ чисел )))
-
Array.Sort(rnd); i1=0; i2=rnd.Length; for (j = 0; j < rnd.Length; j++) if (rnd[j] % 2 == 0) begin sort[i1] = rnd[j]; i1=i1+1; end; else begin sort[i2]=rnd[j]; i2=i2-1; end;
Очень понятно для студентов )))
-
Я из этой ветки одно понял. У всех людей очень разные критерии понятности :)))
-
Ну вот, народ подтянулся и есть оригинальные решения. P.S. В том нашем междусобойчике призерами стали: - Phyton: (здесь честная сортировка на месте ) rnd.sort(key=lambda x: -1*x if x & 0x1 else x, reverse=True) - PascalABC.Net: (здесь использовано разрешение сортировки при печати) begin
var ar := Seq(45,46,8,11,5,29,37,0,21,43,4,5,58,34,14,18,40,46,30);
ar.Println;
ar.Where(x -> x mod 2 = 0).SortedDescending.Print;
Print('');
ar.Where(x -> x mod 2 <> 0).Sorted.Print;
end.
-
P.S. И в том и в другом случае использованы лямбда-функции в строке.
-
То, что в итоге студент взял за основу себе - это максимально ему было понятно: PascalABC.Net: (алгоритм до предела понятен: четные вперед и две пузырьковые сортировки) var k: integer = 0;
var x: integer;
for var i := 0 to ar.High do
if not Odd(ar[i]) then begin
x := ar[i];
for var j := i downto k+1 do
ar[j] := ar[j-1];
ar[k] := x;
Inc(k);
end;
for var i := 0 to k-2 do
for var j := i to k-1 do
if ar[i] < ar[j] then _Swap(ar,i,j);
for var i := k to ar.High-1 do
for var j := i to ar.High do
if ar[i] > ar[j] then _Swap(ar,i,j);
write('sort=', ar.Length,' ', ar);
writeln();
-
Kerk © (04.04.17 17:42) [30] 1. я не программист 2. это моя первая сортировка в жизни. 3. не надо ни кого унижать, всегда найдется чувак круче
-
dmk © (04.04.17 19:51) [37] Не обижайтесь, в жизни всегда находятся те, кто хочет усесться на насесте и повыше, да еще и клушек под себя. Таких мне жаль.
P.S. То, что у Вас все получилось - это же отлично! Очередной небольшой шаг вперед и так всю жизнь, ибо иначе ты - обычный потребитель потребля-а.
-
> Jeer © (04.04.17 19:44) [34] > > rnd.sort(key=lambda x: -1*x if x & 0x1 else x, reverse=True)
Идея как у Суровцева, но как верно заметила manaka, в условии ничего не сказано о том, что числа только положительные. Так что это решение засчитать мы не можем :)
> здесь использовано разрешение сортировки при печати
Это вообще не решение. И сортировка не на месте, и сортированного массива на выходе нет.
> dmk © (04.04.17 19:51) [37]
Ты угадал выходит. См [36] :) Студент не дурак. Решение хоть и не оптимальное, но хотя бы соответствует условиям задачи
|