Я смущен стоимостью и временем алгоритма сортировки вставки в книге «Введение в алгоритмы» 2-го издания от CLRS (стр. 25).Анализ алгоритмов сортировки вложений
Вот алгоритм с затрат и времени:
Insertion-Sort(A) cost times
1. for j <- 2 to length[A] c1 n
2. do key <- A[j] c2 n-1
3. //Insert A[j] into the 0 n-1
//sorted sequence A[1..j-1]
4. i <- j - 1 c4 n-1
5. while i > 0 and A[i] > key c5 sum_{j=2}^n t_j
6. do A[i+1] <- A[i] c6 sum_{j=2}^n (t_j-1)
7. i <- i - 1 c7 sum_{j=2}^n (t_j-1)
8. A[i+1] <- key c8 n-1
Я не понимаю, почему значение
"times" is equal to n
для внешнего контура для линии в 1 выше.
Предположим, что у нас есть массив "A", как показано ниже:
A = [5, 2, 4, 6, 1, 3]
то длина массива 6.
Так,
for j <- 2 to length[A]
будет означать, мы итерацию от индекс 2 - индекс 6, что в 5 раз.
В этом случае, я думаю, для вышеописанного внешнего цикла мы повторяем (n-1) раз, если n - общее количество элементов в массиве.
Итак, я не уверен, почему значение «раз» только для линии 1 (то есть для цикла out) является n вместо (n-1).
Спасибо.
Энди
Хотя это, скорее всего, то, что имел в виду CLRS, я отмечаю, что не существует * требования *, что цикл for будет реализован по мере вашего описания. Цикл for может быть реализован как j = 2; start: if (j == n) goto end; {do stuff} j = j + 1; goto start; end: {do stuff} ...'и теперь сравнение происходит только один раз, когда n равно 2. Это требует, чтобы мы знали, что' j <= n', но, конечно, * зная, что * требует еще одного сравнения! Так что здесь нет бесплатного обеда. –
О, абсолютно. (Хотя большинство компиляторов не захотели бы дублировать тело цикла таким образом, я думаю.) И нет никакой особой причины, почему * количество сравнений * должно быть таким, чтобы считать в любом случае. Но я не могу думать о каком-либо другом мыслительном процессе, который заставил бы авторов написать то, что они сделали. (Если только они не ошиблись, даже люди, столь же умные, как и авторы CLRS, иногда совершают ошибки). –
. Количество сравнений обычно считается подсчетом в сортировках, но, конечно, обычно то, что вам нужно, - это количество сравнений * элементов *, а не * индексов *. –