Если интерес чисто теоритический, то отвечу — лучше писть обобщенный варинат в императивном стиле. Красота в таких вещах совсем не к чему. Оптимальный вариант — это классический Хоровский алгоритм дополненный использованием сортировки вставками при малых размерах массива. Но можно и вообще классику использовать.
Вот адаптировал свои C#-пные примеры:
using System;
using System.Console;
using Nemerle.Utility;
module Utils
{
public Sort[T](this ary : array[T]) : void
where T : IComparable[T]
{
Sort(ary, 0, ary.Length - 1, (x, y) => x.CompareTo(y) > 0);
}
public Sort[T](this ary : array[T], left : int, right : int) : void
where T : IComparable[T]
{
Sort(ary, left, right, (x, y) => x.CompareTo(y) > 0);
}
public Sort[T](this ary : array[T], isGreat : T * T -> bool) : void
{
Sort(ary, 0, ary.Length - 1, isGreat);
}
public Sort[T](
this ary : array[T],
left : int,
right : int,
isGreat : T * T -> bool
)
: void
{
mutable i = left;
mutable j = right;
def center = ary[(left + right) / 2];
while (i <= j)
{
while (isGreat(center, ary[i]))
i++;
while (isGreat(ary[j], center))
j--;
when (i <= j)
{
ary[i] <-> ary[j];
i++;
j--;
}
}
when (left < j)
Sort(ary, left, j, isGreat);
when (right > i)
Sort(ary, i, right, isGreat);
}
}
module Program
{
Main() : void
{
def ary1 = array[2, 3, 1, 9, 3, 7, 0];
ary1.Sort();
WriteLine(ary1.ToString(", "));
ary1.Sort(_ < _);
WriteLine(ary1.ToString(", "));
def ary2 = array["str2", "str23", "str21", "str29", "str23", "str27", "str20"];
ary2.Sort();
WriteLine(ary2.ToString(", "));
ReadLine();
}
}
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Не смешите мои тапочки (с). Какое переполнение на логарифмических алгоритмах?
Мьсьё, Вы не эстет. И совершенно не думаете о будущем. В пользовательском интерфейсе Windows 2024 4-х гигабайтными массивами никого не удивишь.
Здравствуйте, Блудов Павел, Вы писали:
VD>>Не смешите мои тапочки (с). Какое переполнение на логарифмических алгоритмах? БП>Мьсьё, Вы не эстет. И совершенно не думаете о будущем. В пользовательском интерфейсе Windows 2024 4-х гигабайтными массивами никого не удивишь.
Там еще будут 24 процессора для которых один фиг все быстрые сортировки нужно буде переписывать (распараллеливая их работу при больших объемах).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Блудов Павел, Вы писали:
VD>>>Не смешите мои тапочки (с). Какое переполнение на логарифмических алгоритмах? БП>>Мьсьё, Вы не эстет. И совершенно не думаете о будущем. В пользовательском интерфейсе Windows 2024 4-х гигабайтными массивами никого не удивишь.
VD>Там еще будут 24 процессора для которых один фиг все быстрые сортировки нужно буде переписывать (распараллеливая их работу при больших объемах).
Мсье будет работать в 2024-м на таком древнем старье?
Я понимаю хотяб 1024
Каким боком это тоже самое? И вообще это не сортировка слиянием, меньше надо верить википедии. Это больше похоже на сортировку вставкой.
Аналогичный код на Nemerle:
public InsertSort[T](this lst : list[T]) : list[T] where T : IComparable[T]
| item :: rest =>
def insert(lst)
| [] | h :: _ when item.CompareTo(h) < 0 => item :: lst
| h :: t => h :: insert(t)
insert(MergeSort(rest))
| _ => lst
Здравствуйте, Vermicious Knid, Вы писали:
VK>Каким боком это тоже самое? И вообще это не сортировка слиянием, меньше надо верить википедии. Это больше похоже на сортировку вставкой.
Упс, действительно просмотрел То то я удивился, почему так кратко, но разбираться в коде не стал... лень
Здравствуйте, gloomy rocker, Вы писали:
GR>Сорри за offtop, но мне кажется людям это будет интересно. В качестве первого шага в Nemerle я решил написать сортировку списка. Вот результат:
Вобще говоря самый быстрый и короткий способ отсортировать список в немерле это:
public arrsort[T](l : list[T], cmp : T * T -> int) : list[T]
{
l.ToArray().SortInplace(cmp).ToList()
}
Ну а если уж хочется написать руками то нужно писать правильно (попробуй своей сортировкой отсортировать список хотябы из 100К элементов):
Здравствуйте, WolfHound, Вы писали:
WH>Вобще говоря самый быстрый и короткий способ отсортировать список в немерле это: WH>
WH> public arrsort[T](l : list[T], cmp : T * T -> int) : list[T]
WH> {
WH> l.ToArray().SortInplace(cmp).ToList()
WH> }
WH>
Вообще-то у списка есть метод Sort (вызывающий List.MergeSort()) который применяет метод сортировки слиянием. Возоможно на коротких списках он окажется эффективнее. По крайней мере он вполне эффективен чтобы его применять в большинстве мест.
А вообще, если нужны сортированные списки, то лучше использовать массивы. Список не очень рассчитан на это.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Вообще-то у списка есть метод Sort (вызывающий List.MergeSort()) который применяет метод сортировки слиянием. Возоможно на коротких списках он окажется эффективнее. По крайней мере он вполне эффективен чтобы его применять в большинстве мест.
На коротких списках они примерно одинаковы. По крайней мере наводки от всякой фигни больше.
Чем дальше тем сильнее сортировка через массив выигрывает.
Кстати мой mergesort работает быстрее чем List.MergeSort .
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн