Завтра я преподаю демо по сортировке вставками. Одной из важных оптимизаций является добавление проверки во внутренний цикл, которая останавливает его повторение после того, как вы поместите элемент в нужное положение. Итак, в основном, это происходит из этого:
public static void insertionSort(int[] array) {
for (int i = 0; i < array.length; i++) {
for (int j = i; j > 0; j--) {
if (array[j] < array[j-1]) {
int tmp = array[j];
array[j] = array[j-1];
array[j-1] = tmp;
}
}
}
}
к этому:
public static void insertionSort(int[] array) {
for (int i = 0; i < array.length; i++) {
for (int j = i; j > 0 && array[j] < array[j-1]; j--) {
int tmp = array[j];
array[j] = array[j-1];
array[j-1] = tmp;
}
}
}
Вторая версия должна быть более эффективной. Однако, когда я тестирую его, я на самом деле измеряю производительность первой версии как более быструю. Я не могу найти ошибку. Есть идеи, что происходит?
Вот код, который я использую для сравнения:
import java.util.Arrays;
import java.util.Random;
public class InsertionSort {
public static void main(String[] args) {
int[] stuff = getRandomArray(50000);
//System.out.println(Arrays.toString(stuff));
long started = System.currentTimeMillis();
insertionSort(stuff);
long finished = System.currentTimeMillis();
long totalTime = finished - started;
//System.out.println(Arrays.toString(stuff));
System.out.println("Started: " + started);
System.out.println("Finished: " + finished);
System.out.println("Elapsed: " + totalTime);
}
public static int[] getRandomArray(int size) {
int[] array = new int[size];
Random r = new Random();
for (int i = 0; i < array.length; i++) {
array[i] = r.nextInt(size);
}
return array;
}
public static void insertionSort(int[] array) {
// Implementation goes here
}
}
Изменить: изменено количество элементов в тестовом массиве и закомментированы строки для печати.