Перемешать массив
От: Welt  
Дата: 26.11.10 21:11
Оценка:
Есть коллекция/массив элементов, нужно перемещать все элементы, внутри, есть ккой нибудь элегантный быстрый способ, без писания своей функции?
Re: Перемешать массив
От: Lloyd Россия  
Дата: 26.11.10 21:20
Оценка: 12 (2)
Здравствуйте, Welt, Вы писали:

W>Есть коллекция/массив элементов, нужно перемещать все элементы, внутри, есть ккой нибудь элегантный быстрый способ, без писания своей функции?


Создать массив такого же размера с рандмыми числами и воспользоваться Array.Sort, подсунув этот рандомный массив в кач-ве первого параметра и исходный массив — в кач-ве второго.
Re: Перемешать массив
От: Neir0  
Дата: 26.11.10 21:28
Оценка: 3 (1)
Здравствуйте, 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();
Re: Перемешать массив
От: MozgC США http://nightcoder.livejournal.com
Дата: 26.11.10 22:05
Оценка: 15 (2) +1
Здравствуйте, Welt, Вы писали:

W>Есть коллекция/массив элементов, нужно перемещать все элементы, внутри, есть ккой нибудь элегантный быстрый способ, без писания своей функции?


Fisher–Yates/Durstenfeld shuffle

Реализация на C#:
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;
    }
}
Re: Перемешать массив
От: andy1618 Россия  
Дата: 27.11.10 02:05
Оценка:
Здравствуйте, Welt, Вы писали:

W>Есть коллекция/массив элементов, нужно перемещать все элементы, внутри, есть ккой нибудь элегантный быстрый способ, без писания своей функции?


Как раз недавно была веточка с обсуждением подобной задачи:
http://www.rsdn.ru/forum/alg/4045753.aspx
Автор: shrecher
Дата: 19.11.10


Итого имеем как минимум 3 класса решений:
1) за O(1) времени — через ЛКГ
2) за O(n) времени — через последовательное перемешивание (алгоритм Knuth / Fisher–Yates)
3) за O(n*log(n)) времени + O(n) памяти — генерация вспомогательных случайных ключей с последующей сортировкой

На мой взгляд, если не требуется аццкого быстродействия, то вариант 2 — оптимальный.
Re[2]: Перемешать массив
От: Jolly Roger  
Дата: 27.11.10 03:41
Оценка: :)
Здравствуйте, MozgC, Вы писали:

Так вроде у него написано "перемеЩать", а не "перемеШать"
"Нормальные герои всегда идут в обход!"
Re[3]: Перемешать массив
От: MozgC США http://nightcoder.livejournal.com
Дата: 27.11.10 03:44
Оценка: +1
Здравствуйте, Jolly Roger, Вы писали:

JR>Так вроде у него написано "перемеЩать", а не "перемеШать"


Ну в заголовке темы написано именно перемеШать, да и по смыслу это как-то логичнее.
Re: Перемешать массив
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 29.11.10 11:46
Оценка:
Здравствуйте, Welt, Вы писали:

W>Есть коллекция/массив элементов, нужно перемещать все элементы, внутри, есть ккой нибудь элегантный быстрый способ, без писания своей функции?


Nemerle:

public Shuffle[T](col : IList[T]) : void
{
    col.IterI((i, _) => {col[i] <-> col[Random().Next(i)]});
}


... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[2]: Перемешать массив
От: xobotik Россия  
Дата: 30.11.10 01:40
Оценка:
Здравствуйте, MozgC, Вы писали:

Я бы сделал так =)
        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;
        }
С уважением!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.