Сортировка выбором (язык программирования КуМир)

Тема: 
Массивы

Упорядочить массив по возрастанию с помощью сортировки выбором.

Суть сортировки выбором заключается в поиске минимального или максимального элемента в просматриваемой области массива и обмене с ним первого или последнего элемента из этой области.

В коде сортировки ниже внешний цикл делает N-1 итераций. Счетчик j играет роль места в массиве, в которое будет установлен найденный минимальный элемент. Таким образом, сортировка массива начинается с его начала. Количество итераций на 1 меньше, чем элементов в массиве, т.к. последний элемент уже не с чем сортировать.

В теле внешнего цикла предполагается, что последний элемент минимальный. Далее перебираются элементы на отрезке массива от j до N-1 (на неотсортированной части). Если будет найден элемент меньший, чем тот, чей номер записан в переменную id, то эта переменная перезаписывается на номер найденного текущего минимума.

После завершения вложенного цикла найден минимальный элемент на неотсортированном отрезке. Его следует установить в начало этого отрезка массива (по индексу j), а тот элемент, который находится в ячейке j следует записать в ячейку, где ранее был минимальный элемент.

алг сортировка выбором
нач
  цел N = 10
  целтаб a[1:N]
  цел i, j, b, id
 
  нц для i от 1 до N
    a[i] := irnd(100)
    вывод a[i], " "
  кц
  вывод нс
 
  нц для j от 1 до N-1
    id := N
    нц для i от j до N-1
      если a[i] < a[id] то
        id := i
      все
    кц
    b := a[j]
    a[j] := a[id]
    a[id] := b
  кц
 
  нц для i от 1 до N
    вывод a[i], " "
  кц
кон

37 96 82 5 31 85 85 87 80 38 
5 31 37 38 80 82 85 85 87 96 

Можно выполнять сортировку выбором по-другому. В коде ниже массив сортируется с конца. Таким образом, переменная j уменьшается от N до 1 (когда j = 1 цикл уже не выполняется). В теле внешнего цикла сначала ищется максимум, после чего на его место записывается последний элемент неостортированной части массива, а сам максимум записывается на последнее место этой части.

... 
  ...
  j := N
  нц пока j > 1
    id := 1
    нц для i от 2 до j
      если a[i] > a[id] то
        id := i
      все 
    кц
    b := a[j]
    a[j] := a[id]
    a[id] := b
    j := j - 1
  кц
  ...
...

В отличие от кода выше здесь используется цикл со счетчиком. Поэтому не приходится "вручную" уменьшать переменную j.

... 
  ...
  нц для j от N до 2 шаг -1
    id := 1
    нц для i от 2 до j
      если a[i] > a[id] то
        id := i
      все
    кц
    b := a[j]
    a[j] := a[id]
    a[id] := b
  кц
  ...
...