Почему минималистский пример быстрой сортировки Haskell не является «настоящей» быстрой сортировкой? - PullRequest
107 голосов
/ 10 октября 2011

Веб-сайт Haskell представляет очень привлекательную 5-строчную функцию быстрой сортировки , как показано ниже.

quicksort [] = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
    where
        lesser = filter (< p) xs
        greater = filter (>= p) xs

Они также включают "Истинная быстрая сортировка в C" ,

// 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 );
  }
}

Ссылка под версией C направляет на страницу со статусом 'Быстрая сортировка, приведенная во введении, не является "реальной" быстрой сортировкой и не масштабируется для более длинных списков, таких как код cделает. '

Почему вышеприведенная функция Haskell не является настоящей быстрой сортировкой?Как не масштабируется для длинных списков?

Ответы [ 11 ]

0 голосов
/ 10 октября 2011

Поскольку первый элемент из списка приводит к очень плохому времени выполнения.Используйте медиану 3: первый, средний, последний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...