Здравствуйте, Welt, Вы писали:
W>Есть коллекция/массив элементов, нужно перемещать все элементы, внутри, есть ккой нибудь элегантный быстрый способ, без писания своей функции?
Создать массив такого же размера с рандмыми числами и воспользоваться Array.Sort, подсунув этот рандомный массив в кач-ве первого параметра и исходный массив — в кач-ве второго.
Здравствуйте, Welt, Вы писали:
W>Есть коллекция/массив элементов, нужно перемещать все элементы, внутри, есть ккой нибудь элегантный быстрый способ, без писания своей функции?
Может что-то типа того?
var arr = new[]{1,2,3,4,5,6,7,8,9,10};
var rnd = new Random(DateTime.Now.Millisecond);
arr = arr.OrderBy(x => rnd.Next()).ToArray();
Здравствуйте, Welt, Вы писали:
W>Есть коллекция/массив элементов, нужно перемещать все элементы, внутри, есть ккой нибудь элегантный быстрый способ, без писания своей функции?
public static void Shuffle<T>(T[] array)
{
var r = new Random();
for (int i = array.Length; i > 1; i--)
{
int j = r.Next(i);
T tmp = array[j];
array[j] = array[i - 1];
array[i - 1] = tmp;
}
}
Здравствуйте, Welt, Вы писали:
W>Есть коллекция/массив элементов, нужно перемещать все элементы, внутри, есть ккой нибудь элегантный быстрый способ, без писания своей функции?
Итого имеем как минимум 3 класса решений:
1) за O(1) времени — через ЛКГ
2) за O(n) времени — через последовательное перемешивание (алгоритм Knuth / Fisher–Yates)
3) за O(n*log(n)) времени + O(n) памяти — генерация вспомогательных случайных ключей с последующей сортировкой
На мой взгляд, если не требуется аццкого быстродействия, то вариант 2 — оптимальный.
Здравствуйте, Welt, Вы писали:
W>Есть коллекция/массив элементов, нужно перемещать все элементы, внутри, есть ккой нибудь элегантный быстрый способ, без писания своей функции?
private static void Shuffle<T>(T[] array)
{
Random random = new Random();
for (int i = 0; i < array.Length; i++)
{
int j = random.Next(array.Length);
Swap(ref array[i], ref array[j]);
}
}
private static void Swap<T>(ref T first, ref T second)
{
T buf = first;
first = second;
second = buf;
}