- Код: Выделить всё
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]));
Мне интересно, почему так не делают и пишут длинный и скучный код?