Добрый день!
При проверке алгоритмов на время выполнения, столкнулся со следующей ситуацией: Пузырьковый алгоритм, сортирующий массив со значениями расположенными в обратном порядке.
Код:
public void sort2() { //сортировка.
int in, outR, outL;
long temp;
long count=0;
for (outR = nElem - 1; outR > 1; outR--) {
for (in = 0; in < outR; in++)
if (a[in] > a[in + 1]) {
temp = a[in + 1];
a[in + 1] = a[in];
a[in] = temp;
count++;
}
}
System.out.println(count);
}
метод вставки:
public void insert(long value) { //вставка.
a[nElem] = value;
nElem++;
}
и сама вставка значений с последующей сортировкой:
for(int j=100000; j>0; j--) //вставка значений по убыванию.
arr.insert(j);
arr.sort2();//сортировка.
работает в 2 с лишним раза быстрее, чем тот же алгоритм, но обрабатывающий массив устроенный случайным образом.
Код вставки значений в неупорядоченный массив:
for(int j=0; j< maxSize; j++) {
long n = (long) java.lang.Math.random()*(maxSize-1));
arr.insert(n);
}
По логике, массив отсортированный в обратном порядке должен сортироваться в среднем в 2 раза медленнее чем массив отсортированный в обратном порядке. Что показывает статистика при сортировке массивов, со 100 000 элементов:
Случайно отсортированный массив производит 2 510 792 393 операций в методе sort и выполняется за 16 с., а Отсортированный по убыванию с количеством операций 4 999 949 999 выполняется за 7с.
Вопрос: с чем связано более короткое время обработки большего количества операций одним и тем же методом?