Ошибка сортировки вставки в тексте или нет?

1

Я читал учебник, приведенный ниже, и нашел следующий код для сортировки вставки, который кажется мне некорректным, но я хотел получить второе мнение, прежде чем сообщить об этом, поскольку книга уже давно прошла, и я пока не вижу отчета,

Сортировка вставки должна быть 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.

Теги:
algorithm

2 ответа

0

Да, это должен быть купол справа налево, чтобы полностью использовать свойство сортировки сортировки вставки на каждой итерации.

Стандартный псевдокод:

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

Инвердент цикла для сортировки вставки:

  1. В начале каждого цикла A [0..i-1] представляет собой упорядоченную перестановку первых я элементов A []
  2. В конце каждого цикла A [0..i] представляет собой упорядоченную перестановку первых я + 1 элементов из A [].

Таким образом, второй цикл должен обязательно работать справа налево.

0

Внутренняя петля должна быть в reversed проверке. Вставка сортировки выполняется только с отсортированными элементами массива с конца отсортированных элементов. Чтобы получить визуальное и кодовое объяснение... проверьте этот http://visualgo.net/sorting.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню