Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 1
Регистрация: 02.03.2017
Сообщений: 26

Эффективный алгоритм перетасовки элементов массива

02.03.2017, 09:39. Показов 2332. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья, написал вот такую функцию

Java
1
2
3
4
5
6
7
8
9
10
    public static void arrayShuffle(int[] arr)
    {
        int length = arr.length;
        for (int i = 0; i < length; i++) {
            int rnd = (int)(Math.random() * length);
            int tmp = arr[i];
            arr[i] = arr[rnd];
            arr[rnd] = tmp;
        }
    }
Предполагаю, что это не самый совершенный вариант.
Для перетасовки n элементов производится n*4 действий (проверьте плиз правильно ли я понимаю таковые измерения).
Длину массива кладу в переменную length чтобы повторно в цикле не вызывать свойство array.length . Если в этом смысл? Экономлю я вообще тут что-нть?
Покажите алгоритм покруче.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.03.2017, 09:39
Ответы с готовыми решениями:

Эффективный алгоритм для задачи
Условия следующие: Даны n различных натуральных чисел и число m. Нужно выяснить, можно ли представить число m в виде произведения...

Эффективный алгоритм сортировки одного массива по данным другого массива
Всем привет! Время сортировки массива с 2 млн. строк - 0,85 сек., Время сортировки массива индексов по данным этого же массива строк...

Подскажите эффективный алгоритм сортировки массива (желательно многомерного ) на VB
Подскажите эффективный алгоритм сортировки массива (желательно многомерного ) на VB

8
 Аватар для Borsche
183 / 110 / 44
Регистрация: 03.07.2016
Сообщений: 496
02.03.2017, 10:01
Как по мне с рандомом это дело плохое. Рандом он такой рандомный, может прост нехрена не перетасовать.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
02.03.2017, 10:20
Цитата Сообщение от shiva-it Посмотреть сообщение
Для перетасовки n элементов производится n*4 действий
никому не интересно сколько происходит действий. В данном случае тут линейная сложность.
Можете использовать Collections.shuffle.
0
0 / 0 / 1
Регистрация: 02.03.2017
Сообщений: 26
02.03.2017, 10:33  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
никому не интересно сколько происходит действий. В данном случае тут линейная сложность.
Можете использовать Collections.shuffle.
А если все же решать задачу без привлечения высокоуровневых методов? задача-то не практическая, а учебная. Мне интересно есть ли какой-то алгоритм с "нелинейной сложностью" и красивым кодом.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
02.03.2017, 10:37
Цитата Сообщение от shiva-it Посмотреть сообщение
с "нелинейной сложностью"
а с какой? С константной? Логика говорит что нет такого алгоритма

Цитата Сообщение от shiva-it Посмотреть сообщение
красивым кодом.
Цитата Сообщение от shiva-it Посмотреть сообщение
без привлечения высокоуровневых методов
эти два утверждения противоречивы.

Посмотрите как написан shuffle. Там примерно то же что и у вас.
0
0 / 0 / 1
Регистрация: 02.03.2017
Сообщений: 26
02.03.2017, 10:51  [ТС]
Как смотреть устройство метода shuffle? сорри за тупой вопрос
0
 Аватар для Borsche
183 / 110 / 44
Регистрация: 03.07.2016
Сообщений: 496
02.03.2017, 11:04
На вот такой алгорит. Тасование Фишера–Йетса
До вечера реализуй, домашнее задание тебе будет)
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
02.03.2017, 12:44
shiva-it, http://grepcode.com/file/repos... il.List%29
0
0 / 0 / 1
Регистрация: 02.03.2017
Сообщений: 26
02.03.2017, 15:37  [ТС]
Borsche, как-то так. Готов к доработке, но "до вечера" без доработки. Отличная задача. Спасибо. Жду примечаний. Не уверен в присваивании возвращенного из метода массива. Как-то будто не красиво. Или ниче?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.io.IOException;
 
 
public class Main {
 
    public static void main(String[] args) throws IOException{
 
        int[] arr = {1,11,1,5,7,9,2,6,8,0};
 
        //просто вывод
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
 
        arr = fisherYetsShuffle(arr);
 
        //просто вывод
        System.out.println();
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
 
    public static int[] fisherYetsShuffle(int[] arr)
    {
        int[] resultArr = new int[arr.length];
 
        for (int i = 0; i < arr.length; i++) { //i будем использовать как индекс в результирующем массиве
            int pos = (int) (Math.random() * (arr.length - i)); // диапазон случайного число уменьшем на 1 при кажой итерации
            resultArr[i] = getValByIndex(pos,arr);
        }
 
        return resultArr;
    }
 
    public static int getValByIndex(int pos, int[] arr) {
    //возвращает значение pos-ного элемента не равного -1 и вносит на его место -1
        int counter = -1;
        int res = 0;
 
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != -1) {
                counter++;
            }
            if(counter == pos)
            {
                res = arr[i];
                arr[i] = -1;
                break;
            }
 
        }
        return res;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.03.2017, 15:37
Помогаю со студенческими работами здесь

Какой самый эффективный алгоритм для поиска одинаковых элементов в двух возрастающих массивах?
какой?

Эффективный алгоритм поиска простых чисел на С++
Хотел написать функцию которая вычисляет простое число или сложное, но оно не вычисляется. Цикл который я добавил в функцию не работает....

Разработать эффективный алгоритм быстрой сортировки
Быстрая сортировка. Разработайте эффективный алгоритм для упорядочивания n элементов таким образом, чтобы все отрицательные элементы...

Эффективный алгоритм поиска значения в столбце
У меня происходит просмотр столбца А, и последовательный поиск каждого значения из этого столбца в столбце Б. Эта процедура (одна строка...

Более эффективный алгоритм нахождения суммы sin^n(x)
найти сумму sin(x)+sin^2(x)+...+Sin^n(x) или другую любую сумму cout &lt;&lt; &quot;input value of n&amp;x&quot; &lt;&lt; endl; cin &gt;&gt; n&gt;&gt;x; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru