Я пишу демо-класс в Java для анализа следующих алгоритмов сортировки:
которые я реализовал как статические методы в другом классе с именем Sort.
Я хочу сравнить Best-, Average- и Worst-Cases каждого алгоритма, определив время выполнения с аналитической сложностью, используя формулу омикрона.
В демо-классе я хочу только определить время (в наносекундах), каждый алгоритм должен сортировать массив целых чисел с разной длиной в порядковых номерах Best-, Average- и Worst-Case в массиве.
//Best-Case
int[] arrbc0 = {1};
int[] arrbc1 = {1, 2};
int[] arrbc2 = {1, 2, 3};
int[] arrbc3 = {1, 2, 3, 4, 5};
int[] arrbc4 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] arrbc5 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
//Average-Case
int[] arrac1 = {1, 2};
int[] arrac2 = {3, 1, 2};
int[] arrac3 = {4, 2, 3, 1, 5};
int[] arrac4 = {9, 1, 10, 6, 2, 4, 8, 3, 7, 5};
int[] arrac5 = {13, 12, 1, 15, 5, 6, 7, 2, 14, 10, 3, 8, 4, 9, 11};
//Worst-Case
int[] arrwc1 = {2, 1};
int[] arrwc2 = {3, 2, 1};
int[] arrwc3 = {5, 4, 3, 2, 1};
int[] arrwc4 = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
int[] arrwc5 = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
//InsertionSort:
isNanoTime(arrbc0); //first load
isNanoTime(arrbc1);
isNanoTime(arrbc2);
//...
public static void isNanoTime(int[] arr) {
long a1 = System.nanoTime();
Sort.insertionSort(arr);
long a2 = System.nanoTime() - a1;
System.out.println(a2);
}
Теперь у меня есть некоторые вопросы:
@MBo @Jean Logeart
Что ты об этом думаешь:
//Main:
for(int n = 100_000; n <= 1_000_000; n = n + 100_000) {
//f.e. average case of insertion sort:
int[] arr = randomArray(n);
insertionSortWithRuntime(arr);
}
/**
* For best cases using sorted numbers.
* @param n- the length in which the array should be created.
* @return
*/
public static int[] sortedArray(int n) {
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = i;
}
return arr;
}
/**
* For average cases using random numbers.
* @param n - the length in which the array should be created.
* @return
*/
public static int[] randomArray(int n) {
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = (int) (Math.random() * 9 + 1);
}
return arr;
}
/**
* For worst cases using reversed sorted numbers.
* @param n - the length in which the array should be created.
* @return
*/
public static int[] reversedSortedArray(int n) {
int[] arr = new int[n];
int length = n - 1;
for (int i = 0; i < n; i++) {
arr[i] = length;
length--;
}
return arr;
}
Вы представляли это так?
Такие массивы могут демонстрировать худшие и лучшие случаи для InsertionSort и BubbleSort. Типичные реализации MergeSort и SelectionSort имеют одинаковую сложность для всех массивов. Наихудший пример для простой реализации QuickSort - сортированный (или отсортированный) массив.
Страница Wiki с полезной таблицей
Обратите внимание, что эти массивы слишком короткие, чтобы заметить разницу во времени выполнения. Создавайте массивы с 10 ^ 3-10 ^ 6 элементами (для медленных и быстрых алгоритмов соответственно).
Посмотрите на Fisher-Yates, чтобы получить случайную последовательность