Здравствуйте, RomulS, Вы писали:
RS>У меня такая штука получилась:
RS>RS> public qsort(arr: list[int], distinct: bool): list[int]
RS> {
RS> | ([], _) => [];
RS> | (x::[], _) => [x];
RS> | (x::xs, true) => qsort($[y | y in xs, y<x], distinct) + [x] + qsort($[y | y in xs, y>x], distinct);
RS> | (x::xs, false) => qsort($[y | y in xs, y<=x], distinct) + [x] + qsort($[y | y in xs, y>x], distinct);
RS> }
RS>
Одна проблема. Функцию нужно переименовать во что-то вроде SlowSort, так как при этом получается огромное количество копирований подсписков.
Так что подобные примеры — это не более чем демоверсия.

... << RSDN@Home 1.2.0 alpha rev. 637>>
Здравствуйте, VladD2, Вы писали:
VD>Тесты делал? На разных входящих последовательностях тоже? На отсортированных списках (в прямом и обратном напрвлении) пробовал?
случайные числа
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3906225, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.4687470, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0468747, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3749976, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.4843719, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0468747, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3437478, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.5156217, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0468747, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3124980, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.4218723, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0937494, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3749976, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.4687470, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0468747, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.4374972, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.4687470, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0468747, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.4531221, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.4999968, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.4062474, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.4374972, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0468747, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3906225, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.5156217, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0468747, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.4062474, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.4843719, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0468747, arrsort
Отсортировано в прямом порядке
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3749976, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3749976, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.2187486, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3124980, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0468747, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.2499984, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3749976, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.1874988, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3906225, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.2187486, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3437478, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.2812482, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3437478, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.2031237, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3749976, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0156249, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.1874988, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3593727, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.2187486, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3437478, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0468747, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.2031237, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3437478, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
Отсортировано в обратном порядке
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.2656233, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.2812482, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.2656233, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.2968731, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.1874988, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3749976, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.1562490, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3281229, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.1718739, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3749976, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.2187486, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.2656233, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.2031237, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3749976, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0624996, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.1718739, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.2968731, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.1874988, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3749976, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.1562490, my mergesort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.3437478, List.MergeSort
True 100000 (-6502787664072455845, -9132673546309142552) 00:00:00.0312498, arrsort
VD>Если, сортировка на базе массива самая быстрая в любом случае, то стоит выкинуть ту реализацию, что есть сейчас и вставить сортировку с промежуточным массивом. За одно можно сделать фунцию типа SortToArray().
Там нужно добавить еще много функций...
Например:
public static MapFilteredRev[T, U](this lst : list[T], fn : T -> option[U]) : list[U]
{
def loop(lst, res)
{
match (lst)
{
| head :: tail =>
match (fn(head))
{
| Some(elem) =>
loop(tail, elem :: res);
| None =>
loop(tail, res);
}
| [] => res;
}
}
loop(lst, []);
}
public static MapFiltered[T, U](this lst : list[T], fn : T -> option[U]) : list[U]
{
lst.MapFilteredRev(fn).Rev()
}
... << RSDN@Home 1.2.0 alpha rev. 745>>