У меня никогда не было особой потребности в написании больших объемов формального псевдокода, но необходимость возникла, поэтому я решил выбрать некоторые стандарты, чтобы оставаться согласованным в коде.
С этой целью я подобрал несколько обучающих видео «iTunes U», среди прочего 6.046J / 18.410J Введение в алгоритмы (SMA 5503).
В самом первом лекционном видео лектор пишет на доске «Сортировка вставками», и он пишет это:
Insertion-Sort(A, N) // Sorts A[1..n]
for j ← 2 to n
do key ← A[j]
i ← j-1
while i > 0 and A[i] > key
do A[i+1] ← A[i]
i ← i-1
A[i+1] ← key
Итак, мои вопросы:
- Почему
i ← j-1
, когдаA[i+1] = key
? То есть почему в одном случае←
, а в другом=
? Обратите внимание, что в приведенном выше коде←
используется и для последнего, но в раздаточных материалах, доступных в Интернете, используется=
, это просто опечатка? (я так предполагаю) - Что еще более важно, почему
do key ← A[j]
, когдаi ← j-1
? Что такого особенного, что для этого требуется такая командаdo
и отступ?
Другими словами, почему приведенный выше псевдокод не написан так (с моими выделениями):
Insertion-Sort(A, N) // Sorts A[1..n]
for j ← 2 to n
key ← A[j] <-- lost the do here
i ← j-1 <-- no indentation
while i > 0 and A[i] > key
A[i+1] ← A[i] <-- lost the do here
i ← i-1 <-- no indentation
A[i+1] ← key
Последний вопрос: есть ли у кого-нибудь стандарт кода для псевдокода? Моя главная цель — постоянство, чтобы мне приходилось «учить» получателей только один раз.