Возможно, сортировочная сеть наиболее эффективна с учетом небольшого числа аргументов и того факта, что их число известно во время компиляции (без условий цикла).
Тип пузыря хорошо подходит для сортировки сети. Я бросил это вместе. Она работает, и это действительно просто:
import std.stdio, std.string;
void bubbleSort(T...)(ref T values)
{
static if (T.length > 1)
{
foreach(I, _; T[0 .. $ - 1])
{
pragma(msg, format("[%s %s]", I, I + 1));
compareAndSwap(values[I], values[I + 1]);
}
bubbleSort(values[0 .. $ - 1]);
}
}
void compareAndSwap(T)(ref T a, ref T b)
{
import std.algorithm;
if(a > b)
swap(a, b);
}
void main()
{
int a = 10;
int b = 30;
int c = 11;
int d = 20;
int e = 4;
int f = 330;
int g = 21;
int h = 110;
shellSort(a, b, c, d, e, f, g, h);
writefln("%s %s %s %s %s %s %s %s!", a, b, c, d, e, f, g, h);
}
Хотя, честно говоря, если это стандартная библиотека, любая сортировка сеть менее 10 аргументов должны быть рукописными.
EDIT: Я полностью изменил предыдущий алгоритм, который был на самом деле очень неопределенным. Сорт Bubble не оптимальный, но он действительно работает нормально для алгоритмов сортировки. Там есть некоторые прагмы, чтобы увидеть построенную сеть.
Это очень умно. Спасибо. –
Возможно, вы должны добавить ссылку на этот отличный ответ в потоке проблемы github, чтобы узнать больше о том, почему мотивирован запрос на вывод std.algorithm? –
Одно отражение, хотя ... - не все ли элементы должны быть одного типа, чтобы быть 'isAssignable' друг для друга во всех направлениях (комбинациях)? Я считаю, что '! CommonType! T == void' не является достаточным требованием для этого. –