Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
2 / 2 / 0
Регистрация: 13.10.2018
Сообщений: 245

Как лучше исследовать скорость сортировки массивов

28.02.2021, 18:36. Показов 2076. Ответов 9

Студворк — интернет-сервис помощи студентам
Имеется 3 вида сортировки (Шелла, шейкерная и третья не знаю как называется, но всё работает)

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
import java.util.Scanner;
 
public class Main {
    public static void firstMethod(int[] a) {
        int N = a.length, temp;
        int t = (int) (Math.log(N) / Math.log(2) - 1);
        int[] h = new int[t];
        h[0] = 1;
        for (int i = 1; i < h.length; i++) {
            h[i] = 2 * h[i - 1] + 1;
        }
        t--;
 
        while (t >= 0) {
            int inc = h[t];
            t--;
            for (int i = inc; i < N; i++) {
                temp = a[i];
                int j = i - inc;
                while (j >= 0 && a[j] > temp) {
                    a[j + inc] = a[j];
                    j -= inc;
                }
                a[j + inc] = temp;
            }
        }
    }
 
    public static void secondMethod(int[] a) {
        int N = a.length, bmin, min;
        int gCnt = (int) Math.ceil(Math.sqrt(a.length));
        int gLen = (int) Math.round(Math.sqrt(a.length));
        int[] buf = new int[gCnt];
        int[][] gBorders = new int[gCnt][2];
        int[] b;
 
        gBorders[0][0] = 0;
        gBorders[0][1] = gLen - 1;
        for (int i = 1; i <= gCnt - 1; i++) {
            gBorders[i][0] = gBorders[i - 1][0] + gLen;
            gBorders[i][1] = gBorders[i - 1][1] + gLen;
        }
 
        gBorders[gCnt - 1][1] = N - 1;
        for (int i = 0; i < gCnt; i++) {
            min = gBorders[i][0];
            for (int j = gBorders[i][0] + 1; j <= gBorders[i][1]; j++) {
                if (a[min] > a[j]) {
                    min = j;
                }
            }
            buf[i] = a[min];
            a[min] = Integer.MAX_VALUE;
        }
 
        b = new int[a.length];
        for (int k = 0; k < N; k++) {
            bmin = buf[0];
            int number = 0;
 
            for (int i = 1; i < buf.length; i++) {
                if (bmin > buf[i]) {
                    bmin = buf[i];
                    number = i;
                }
            }
            bmin = number;
            b[k] = buf[bmin];
            buf[bmin] = Integer.MAX_VALUE;
            min = gBorders[bmin][0];
            for (int i = gBorders[bmin][0] + 1; i <= gBorders[bmin][1]; i++) {
                if (a[min] > a[i]) {
                    min = i;
                }
            }
            buf[bmin] = a[min];
            a[min] = Integer.MAX_VALUE;
        }
        for (int i = 0; i < a.length; i++) {
            a[i] = b[i];
        }
    }
 
    public static void thirdMethod(int[] a) {
        int N = a.length;
        int l = 0, r = N - 1, temp;
        while (l < r) {
            for (int i = l; i < r; i++) {
                if (a[i] > a[i + 1]) {
                    temp = a[i];
                    a[i] = a[i + 1];
                    a[i + 1] = temp;
                }
            }
            r--;
            for (int j = r; j >= l; j--) {
                if (a[j] > a[j + 1]) {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
            l++;
        }
    }
 
    public static void main(String[] args) {
        int method, count;
        System.out.print("method: ");
        Scanner sc = new Scanner(System.in);
        if (sc.hasNextInt()) {
            method = sc.nextInt();
            if (method > 3 || method < 1) {
                System.out.println("input-output error");
                sc.close();
                return;
            }
        } else {
            System.out.println("input-output error");
            sc.close();
            return;
        }
 
        System.out.print("Count: ");
        if (sc.hasNextInt())
            count = sc.nextInt();
        else {
            System.out.println("input-output-error");
            sc.close();
            return;
        }
        if (count < 1) {
            System.out.println("input-output-error");
            sc.close();
            return;
        }
 
        int[] array = new int[count];
 
        System.out.println("items: ");
        for (int i = 0; i < array.length; i++) {
            if (sc.hasNextInt()) {
                array[i] = sc.nextInt();
            } else {
                System.out.println("input-output error");
                sc.close();
                return;
            }
        }
        sc.close();
 
        switch (method) {
        case 1:
            firstMethod(array);
            break;
        case 2:
            secondMethod(array);
            break;
        case 3:
            thirdMethod(array);
            break;
        }
 
        System.out.println("result:");
        for (int item : array) {
            System.out.print(item + " ");
        }
    }
}
Нужно эмпирически выяснить:
1) Как время выполнения алгоритмов сортировки зависит от количества элементов в массиве.
2) Какой из трёх реализованных методов является самым быстрым, когда:
▪ в массиве мало элементов;
▪ в массиве много элементов;
▪ элементы массива расположены в обратном (убывающем) порядке;
▪ Большинство элементов массива уже расставлены (предварительно отсортированный).

Как лучше реализовать проверку? получается нужно как-то создавать массив разной длины, передавать его в каждый из трёх методов, в тоже время засекать время (system.nanotime).
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.02.2021, 18:36
Ответы с готовыми решениями:

Как измерить время сортировки 4 массивов?
Как сделать таймер, чтобы измерял время сортировки каждого из 4-х массивов ?

Как переделать алгоритм для сортировки массивов?
Здравствуйте. У меня имеется двумерный массив Dim Massiv(i-1, J-1) As integer Соответственно из i строк и j столбцов. Все элементы...

Как лучше составить программу для сортировки элементов массива?
Нужно составить программу, c помощью которо

9
 Аватар для Aviz__
2758 / 2065 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
28.02.2021, 18:52
Цитата Сообщение от Bronzor Посмотреть сообщение
массив разной длины
одинаковой длинны и степени сортировки.
0
2 / 2 / 0
Регистрация: 13.10.2018
Сообщений: 245
28.02.2021, 19:28  [ТС]
Цитата Сообщение от Aviz__ Посмотреть сообщение
одинаковой длинны и степени сортировки.
Не понял, надо будет создавать длины разной длины (то есть, будет 10,20,50, 100,1000 элементов) и этот массив надо будет сортировать с помощью имеющихся методов попутно измеряя время.

Добавлено через 6 минут
Вот я и спрашиваю, как это всё лучше реализовать.
Пока что это написал:
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
public static int[] randomFillAndTime(int[] a) {
        Random rand = new Random();
        for (int i = 0; i < a.length; i++) {
            a[i] = rand.nextInt(101);
        }
        long avg = 0;
        for(int j=0;j<a.length;j++) {
            long t1 = System.nanoTime();
            firstMethod(a);
            long t4 = System.nanoTime();
            avg = t4-t1;
            System.out.println("firstMethod: "+avg);
            avg=0;
        }
        for(int j=0;j<a.length;j++) {   
            long t1 = System.nanoTime();
            long t2 = System.nanoTime();
            long t3 = System.nanoTime();
            secondMethod(a);
            long t4 = System.nanoTime();
            long t5 = System.nanoTime();
            long t6 = System.nanoTime();
            avg = (t4+t5+t6)/3-(t1+t2+t3)/3;
            System.out.println("secondMethod: "+avg);
            avg=0;
        }
        for(int j=0;j<a.length;j++) {   
            long t1 = System.nanoTime();
            long t2 = System.nanoTime();
            long t3 = System.nanoTime();
            thirdMethod(a);
            long t4 = System.nanoTime();
            long t5 = System.nanoTime();
            long t6 = System.nanoTime();
            avg = (t4+t5+t6)/3-(t1+t2+t3)/3;
            System.out.println("thirdMethod: "+avg);
            avg=0;
        }
        return a;
    }
10 раз создаётся массив состоящий из стольки элементов, сколько мы напишем и заполняется случайными числами от 0 до 100. Затем 10 раз сортируется первым, вторым и третьим методом, в тоже время замеряется время. Но во-первых, получается слишком длинный код, во-вторых, почему-то каждый раз появляются большие значения. в среднем 2500, первый раз всегда огромное число (>20000).
Вот пример:
Кликните здесь для просмотра всего текста

method: 4
Count: 10
items:
firstMethod: 42338
firstMethod: 1925
firstMethod: 13792
firstMethod: 1603
firstMethod: 1283
firstMethod: 1283
firstMethod: 1283
firstMethod: 1604
firstMethod: 1604
firstMethod: 1283
secondMethod: 298929
secondMethod: 7912
secondMethod: 5880
secondMethod: 5773
secondMethod: 5131
secondMethod: 5453
secondMethod: 5773
secondMethod: 5559
secondMethod: 5773
secondMethod: 5666
thirdMethod: 3635
thirdMethod: 1604
thirdMethod: 1283
thirdMethod: 1604
thirdMethod: 1496
thirdMethod: 1604
thirdMethod: 1390
thirdMethod: 1711
thirdMethod: 1497
thirdMethod: 1283
result:
13 37 40 48 57 75 77 87 93 97
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
28.02.2021, 19:46
Лучший ответ Сообщение было отмечено korvin_ как решение

Решение

Используйте jmh.
1
 Аватар для Aviz__
2758 / 2065 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
28.02.2021, 19:50
Цитата Сообщение от Bronzor Посмотреть сообщение
то есть, будет 10,20,50, 100,1000 элементов
да и больше элементов в какойнить Лист<int[]> затем каждый массив в методы сортировки, раз 100 гоняешь время засекаешь среднее и делаешь выводы.
1
2 / 2 / 0
Регистрация: 13.10.2018
Сообщений: 245
01.03.2021, 12:45  [ТС]
Tavashi, А есть попроще вариант? только циклы, методы освоили.

Добавлено через 3 часа 35 минут
Tavashi, Aviz__,
Например, вот так будет корректно сравнивать? создаётся случайный массив, длину буду вписывать в консоле при запуске программы, затем помещаю созданный массив в первый метод делаю 100 замеров, нахожу среднее время вывожу, затем всё тоже самое только со вторым и третьим методом.

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
public static int[] randomFillAndTime(int[] a) {
        Random rand = new Random();
        for (int i = 0; i < a.length; i++) {
            a[i] = rand.nextInt(10001);
        }
        long avg = 0;
        for (int j = 0; j < 101; j++) {
            long t1 = System.nanoTime();
            firstMethod(a);
            long t4 = System.nanoTime();
            avg += t4 - t1;
        }
        System.out.println("firstMethod: " + (avg / 100));
        
        avg = 0;
        for (int j = 0; j < 101; j++) {
            long t1 = System.nanoTime();
            secondMethod(a);
            long t4 = System.nanoTime();
            avg += t4 - t1;
        }
        System.out.println("secondMethod: " + (avg / 100));
        
        avg = 0;
        for (int j = 0; j < 101; j++) {
            long t1 = System.nanoTime();
            thirdMethod(a);
            long t4 = System.nanoTime();
            avg += t4 - t1;
        }
        System.out.println("thirdMethod: " + (avg / 100));
        return a;
    }
0
 Аватар для Aviz__
2758 / 2065 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
01.03.2021, 12:52
Цитата Сообщение от Bronzor Посмотреть сообщение
длину буду вписывать в консоле при запуске
зачем?! я же тебе уже рассказывал, как все сделать, а ты "опять за рыбу деньги"((. лист массивов разной длинны создать - это проблема?
1
2 / 2 / 0
Регистрация: 13.10.2018
Сообщений: 245
01.03.2021, 13:03  [ТС]
Aviz__,
Да, по условию задания нельзя использовать коллекции.
0
 Аватар для Aviz__
2758 / 2065 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
01.03.2021, 13:18
Цитата Сообщение от Bronzor Посмотреть сообщение
нельзя использовать коллекции.
уточни у препода, может, как хранилища массивов можно. или двумерные, где каждая строчка массив своей длинны, фигач.
1
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
02.03.2021, 00:30
Цитата Сообщение от Bronzor Посмотреть сообщение
А есть попроще вариант? только циклы, методы освоили.
Jmh как раз и есть вариант попроще: удобно организовать прогрев и инициализацию, которые не должны являться частью бенчмарка.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.03.2021, 00:30
Помогаю со студенческими работами здесь

Напишите функцию сортировки, похожую на функцию которая использовалась для сортировки массивов, с той разницей, что ее а
Напишите функцию сортировки, похожую на функцию которая использовалась для сортировки массивов, с той разницей, что ее аргументом должен...

Исследовать скорость поиска элемента по значению в List и LinkedList
Добрый день, подскажите пожалуйста, как работает данная строка в программе. Она ищет первый узел, в который входит это значение? И почему...

скорость сортировки
вот написал к примеру програмку. работает так Меню с пунктами: 1.для заполнения матрицы 2.для сортировки 3.для принта 4.для...

Исследовать возможности адаптации различных методов сортировки к структуре исходного массива
Исследовать возможности адаптации различных методов сортировки к структуре исходного массива. С этой целью определить время сортировки ...

Скорость быстрой сортировки
Почему среднее время быстрой сортировки равно лучшему?


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru