Конференция "Прочее" » Студенческая задачка
 
  • Сергей Суровцев © (04.04.17 13:21) [20]
    >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);
  • Sha © (04.04.17 13:44) [21]
    > Kerk ©   (04.04.17 12:56) [19]
    >> dmk ©   (04.04.17 12:07) [18]
    >> С оптимизацией 64 бита - 8 секунд. Подумаю еще над оптимизацией.
    > А смысл? Неужто есть надежда сделать быстрее квиксорта?

    Разумеется, можно.
    RadixSort в несколько раз быстрее, например, см. http://guildalfa.ru/alsha/node/21
  • Kerk © (04.04.17 14:00) [22]

    > Сергей Суровцев ©   (04.04.17 13:21) [20]

    Оригинально :)
  • Сергей Суровцев © (04.04.17 14:15) [23]
    >Kerk ©   (04.04.17 14:00) [22]
    Главное - мгновенно и не зависит от ЯП.
  • Kerk © (04.04.17 14:29) [24]

    > Сергей Суровцев ©   (04.04.17 14:15) [23]

    Мне нравится. Но целых три строки, забракуют твое решение :)
  • Сергей Суровцев © (04.04.17 14:51) [25]
    >Kerk ©   (04.04.17 14:29) [24]
    >Но целых три строки, забракуют твое решение :)
    Ну реально, то строк две. ))

    Зато:
    >Требования: простота, изящность, самодокументируемость кода для понимания студентами.
    >Бонусом - эффективность исполнения (быстродействие).
  • Sha © (04.04.17 15:16) [26]
    На самом деле студенту повезло, что препод дает такие задачи,
    хоть тутошнему большинству они и кажутся детскими.

    В последнее время все чаще приходится видеть студентов,
    которые поменять 0 на 1 и обратно в один оператор без if не умеют.

    А задачу замены 0->1->2->0 по кругу и задать-то некому )
  • Kerk © (04.04.17 16:33) [27]

    > Сергей Суровцев ©   (04.04.17 14:51) [25]
    >
    > >Kerk ©   (04.04.17 14:29) [24]
    > >Но целых три строки, забракуют твое решение :)
    > Ну реально, то строк две. ))

    Я все думаю как бы так записать код, чтобы избежать дублирования строк. Они же реально одинаковые. Но пока не придумал.
  • dmk © (04.04.17 17:06) [28]
    >Неужто есть надежда сделать быстрее квиксорта?
    Всегда удивлялся таким вопросам. Его надо Джону Кармаку задать. Он будет на вас долго удивляться. Возможно зависнет ;)
  • Kerk © (04.04.17 17:38) [29]
    Не знал, что он тоже писал гору мутного ассемблерного кода, чтобы получить нечто на пару порядков медленнее банальных библиотечных реализаций.

    Тупой как пробка код из [12] сортирует 100000 элементов за 0.12 секунды
    Крутой ассемблерный код из [13] сортирует 100000 элементов за 18.5 секунды

    Запускал на одном и том же ноутбуке для чистоты сравнения. Чтобы быть как Кармак, нужно думать как Кармак. А Кармак думает о практической необходимости и эффективности.

    Ничего личного.
  • Kerk © (04.04.17 17:42) [30]
    Я правильно понял, что по сути [13] - это по сути три сортировки пузырьком?
  • manaka © (04.04.17 18:13) [31]

    > Сергей Суровцев ©   (04.04.17 13:21) [20]


    Не нашла в условии пункта, что исходный массив ПОЛОЖИТЕЛЬНЫХ чисел )))
  • manaka © (04.04.17 19:10) [32]
    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;

    Очень понятно для студентов )))
  • Kerk © (04.04.17 19:33) [33]
    Я из этой ветки одно понял. У всех людей очень разные критерии понятности :)))
  • Jeer © (04.04.17 19:44) [34]
    Ну вот, народ подтянулся и есть оригинальные решения.

    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.

  • Jeer © (04.04.17 19:45) [35]
    P.S.
    И в том и в другом случае использованы лямбда-функции в строке.
  • Jeer © (04.04.17 19:50) [36]
    То, что в итоге студент взял за основу себе - это максимально ему было понятно:

    PascalABC.Net:
    (алгоритм до предела понятен: четные вперед и две пузырьковые сортировки)

    // Body  
     var k: integer = 0;
     var x: integer;
     
    // Even to head
     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;
    // Sort even
     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);
    // Sort odd
     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();

  • dmk © (04.04.17 19:51) [37]
    Kerk ©   (04.04.17 17:42) [30]
    1. я не программист
    2. это моя первая сортировка в жизни.
    3. не надо ни кого унижать, всегда найдется чувак круче
  • Jeer © (04.04.17 19:58) [38]
    dmk ©   (04.04.17 19:51) [37]
    Не обижайтесь, в жизни всегда находятся те, кто хочет усесться на насесте и повыше, да еще и клушек под себя.
    Таких мне жаль.

    P.S.
    То, что у Вас все получилось - это же отлично! Очередной небольшой шаг вперед и так всю жизнь, ибо иначе ты - обычный потребитель потребля-а.
  • Kerk © (04.04.17 20:03) [39]

    > 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] :)
    Студент не дурак. Решение хоть и не оптимальное, но хотя бы соответствует условиям задачи
 
Конференция "Прочее" » Студенческая задачка
Есть новые Нет новых   [134431   +10][b:0.001][p:0.002]