Я читал учебник, приведенный ниже, и нашел следующий код для сортировки вставки, который кажется мне некорректным, но я хотел получить второе мнение, прежде чем сообщить об этом, поскольку книга уже давно прошла, и я пока не вижу отчета,
Сортировка вставки должна быть O (n) на сортированном наборе, но это выглядит так, как если бы она была O (n ^ 2) на отсортированном множестве, поскольку она проходит через все, кроме первого элемента во внешнем цикле, а затем все элементы до внешнего контура подсчитываются во внутреннем цикле.
Было бы правильным сказать, что внутренний цикл должен быть изменен для проверки справа налево, чтобы сравнить только самый правый элемент, когда вход был отсортирован?
// Sort an array using a simple insertion sort.
public void insertionSort(int[] data) {
for (int which = 1; which < data.length; ++which) {
int val = data[which];
for (int i = 0; i < which; ++i) {
if (data[i] > val) {
System.arraycopy(data, i, data, i + 1, which - i);
data[i] = val;
break;
}
}
}
}
Монган, Джон (2012-11-14). Подготовленные интервью с программистами: секреты приземления вашего следующего задания (разжигать места 3460-3464). Wiley. Kindle Edition.
Да, это должен быть купол справа налево, чтобы полностью использовать свойство сортировки сортировки вставки на каждой итерации.
Стандартный псевдокод:
for i ← 1 to length(A)-1
j ← i - 1
while j > 0 and A[j-1] > A[j]
swap A[j] and A[j-1]
j ← j - 1
Инвердент цикла для сортировки вставки:
Таким образом, второй цикл должен обязательно работать справа налево.
Внутренняя петля должна быть в reversed
проверке. Вставка сортировки выполняется только с отсортированными элементами массива с конца отсортированных элементов. Чтобы получить визуальное и кодовое объяснение... проверьте этот http://visualgo.net/sorting.html