При выполнении некоторых задач требуется перемешать случайным образом (перетасовать) массив или список с данными. Для решения данной проблемы существуют специальные алгоритмы. Рассмотрим один один из таких алгоритмов под названием Тасование Фишера-Йетса.
Алгоритм Фишера — Йетса (Современная версия)
Тасование Фишера-Йетса (Fisher–Yates shuffle) используется для выполнения случайных перестановок множества элементов. Например, массивов или списков.
На псевдокоде алгоритм можно представить следующим образом:
Ниже будут приведены реализации данного алгоритма на языках Си и C#.
Перемешать массив на Си
Перемешать элементы массива, состоящего из целых чисел, на языке программирования Си можно с помощью следующей функции shuffle (реализованной ниже). Пример программы:
Результат работы программы (изначально массив был заполнен десятичными цифрами в порядке от 0 до 9):
Можно отредактировать функцию shuffle, изменив тип данных массива, указав вместо целого типа данных int, любой другой нужный.
Перемешать массив на C#
Перемешать элементы массива целых чисел на языке C# можно с помощью следующего метода, реализующего алгоритм Фишера — Йетса:
Целый тип int можно заменить на любой другой, который вам потребуется.
Чтобы не дублировать код, создавая методы под каждый тип данных, можно создать один универсальный метод, используя обобщения C#:
Как перемешать список на C#
Тасование Фишера-Йетса также можно использовать для перемешивания списков и других коллекций. Реализуем алгоритм для случайной перестановки элементов списка List на C#, используя обобщенный тип данных.
Для более удобного использования метода перемешивания элементов, можно создать потомка класса коллекции (например списка) и реализовать в классе-потомке данный метод.
Дальнейшее создание списка и применение метода перемешивания элементов, будет реализовываться следующим образом:
Стоит отметить, что в языке Java у коллекций (например у ArrayList) уже есть реализованный метод с названием shuffle, перемешивающий элементы.
Поделиться в соц. сетях: