QuickSort, почти как Haskell, только Pascal

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

QuickSort, почти как Haskell, только Pascal

Сообщение absdjfh » 22.03.2013 18:51:08

Когда рассказывают о функциональных языках программирования, особенно о Haskell, очень часто упоминают алгоритм быстрой сортировки:
Код: Выделить всё
quicksort :: Ord a => [a] -> [a]
quicksort []     = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
    where
        lesser  = filter (< p) xs
        greater = filter (>= p) xs

и сравнивают его с кодом на Си:
Код: Выделить всё
// To sort array a[] of size n: qsort(a,0,n-1)

void qsort(int a[], int lo, int hi)
{
  int h, l, p, t;

  if (lo < hi) {
    l = lo;
    h = hi;
    p = a[hi];

    do {
      while ((l < h) && (a[l] <= p))
          l = l+1;
      while ((h > l) && (a[h] >= p))
          h = h-1;
      if (l < h) {
          t = a[l];
          a[l] = a[h];
          a[h] = t;
      }
    } while (l < h);

    a[hi] = a[l];
    a[l] = p;

    qsort( a, lo, l-1 );
    qsort( a, l+1, hi );
  }
}

Примерно такой же алгоритм записан и в паскале.
Но ведь его можно записать как-нибудь так:
Код: Выделить всё
function QuickSort(const A: Arr): Arr;
var
  Lesser, Greater: Arr;
begin
  if Empty(A) then Result := A
  else
  begin
    Lesser := Filter(@LessThan, A[0], A);
    Greater := Filter(@GreaterThan, A[0], A);
    Result := QuickSort(Lesser) + A[0] + QuickSort(Greater);
  end;
end;

И вызывать, например, так:
Output(QuickSort([5, 4, 3.2, 4.8, 6.7, 6.2, 18, 12.6]));
Мне интересно, почему так не делают и пишут длинный и скучный код? :)
absdjfh
новенький
 
Сообщения: 60
Зарегистрирован: 21.01.2012 13:59:00

Re: QuickSort, почти как Haskell, только Pascal

Сообщение Sergei I. Gorelkin » 22.03.2013 20:07:25

Можно и так написать, просто 90% (навскидку) времени работы такого кода уйдет на обслуживание промежуточных массивов, а не на сортировку.
"Длинный и скучный" код не тратит ни байта дополнительной памяти и вообще не требует динамической памяти. Его не нужно писать каждый раз,он написан один раз и просто вызывается по мере надобности.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: QuickSort, почти как Haskell, только Pascal

Сообщение absdjfh » 22.03.2013 22:54:58

Это все да, но ведь и код haskell такой же медленный (если эту процедуру записать в таком виде). Тогда не ясно, в чем его преимущества, если такой же по сложности понимания код можно написать и здесь?
absdjfh
новенький
 
Сообщения: 60
Зарегистрирован: 21.01.2012 13:59:00

Re: QuickSort, почти как Haskell, только Pascal

Сообщение alexey38 » 23.03.2013 13:56:08

absdjfh писал(а):Это все да, но ведь и код haskell такой же медленный (если эту процедуру записать в таком виде). Тогда не ясно, в чем его преимущества, если такой же по сложности понимания код можно написать и здесь?

Мое личное мнение - Паскаль намного круче всех этих haskell-ов и прочего. Сравните Вами приведенный текст на haskell и на паскале. В одном случае куча кракозябр, и нужно еще догадаться как это работает. А код на паскале будет понятным даже непрограммисту, который просто по английски прочитает текст программы.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: QuickSort, почти как Haskell, только Pascal

Сообщение Сквозняк » 30.03.2013 17:16:52

Тогда не ясно, в чем его преимущества, если такой же по сложности понимания код можно написать и здесь?

Потому что функциональщикам удобнее или прикольнее заменять применяемую в естественном познании логику математикой: никаких тебе байтов, циклы не нужны, числа резиновые, ресурсы компьютера - тоже, изобретай замороченные формулы вместо понятных операций над переменными и радуйся жизни.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32


Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

Рейтинг@Mail.ru