Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
26
Добавлен:
30.04.2013
Размер:
183.81 Кб
Скачать

4.4.5. Разработка алгоритма подпрограммы сортировки

Теперь можно разработать алгоритм собственно сортировки, внешняя спецификация которого была разработана ранее.

Вначале изложим идею сортировки (упорядочивания) чисел по неубыванию методом полного перебора. В результате ее выполнения для любой пары соседних чисел должно выполняться условие aiai+1. (Здесьa– имя массива,i– индекс элемента массива).

Положим, что подлежащий упорядочиванию массив разбит на две части: в первой части, содержащей (k-1) элементов с номерами (1,..,k-1) все элементы уже упорядочены, а во второй – с номерами (k, .., n) – нет. Это означает, что во второй части массива нет ни одного элемента, значение которого было бы меньше значений элементов с номерами (1,..,k-1).

Идея сортировки состоит в том, чтобы выбрать наименьший элемент в этой второй части и обменять его с элементом, находящимся на k-той позиции. В результате этого число упорядоченных элементов увеличится на единицу, а неупорядоченными останутся элементы с номерами (k+1, .., n). Указанный процесс надо повторить для k = 1,2, …, n-1, и в результате все n элементов массива окажутся на своих местах.

Приведем графическую иллюстрацию этого процесса.

a[1]

a[2]

...

a[k]

a[kmin]

a[n]

Temp

Теперь можно построить укрупненный алгоритм подпрограммы сортировки (с именем SortAll).

Алгоритм SortAll

Входные данные:

a[1..n] : вещ {массив}

n : цел {число элементов в массиве}

Выходные данные:

a[1..n] : вещ {массив}

Внутренние переменные:

k : цел {номер текущего элемента}

Начало

цикл-от k:=1 до (n-1)

Найти-минимальный-элемент

Переместить-мин.-элемент-на-позицию-k

кцикл

Конец

Проверку данного алгоритма можно выполнить «в уме». Единственное условие, подлежащее здесь проверке, – правильно ли задается последнее значение счетчика цикла “j=(n-1)”. Это условие правильное, поскольку при этом значении j минимальный элемент ищется среди предпоследнего (n-1) и последнего (n) элементов массива.

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

Выше уже говорилось, что минимальный элемент надо искать среди элементов с номерами (k, k+1, ... , n). Этот фрагмент алгоритма приведен ниже:

План “Найти-минимальный-элемент”

Внутренние переменные:

kmin : цел {номер минимального элемента}

j : цел {номер проверяемого элемента}

Начало

kmin := k

цикл-от j:=k+1 до n

если a[j] < a[kmin] то

kmin] := j

все

кцикл

Конец

Проверим полученный фрагмент (плана алгоритма).

Во-первых, согласно условиям, выработанным выше для переменной k, цикл будет выполняться, по меньшей мере, один раз.

Во-вторых, для проверки тела цикла по критерию «все условия» необходимо, чтобы условие a[j] < a[kmin]один раз выполнялось, а другой раз – нет.

Отсюда, для проверки алгоритма требуется два теста.

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

Поместим эти тесты в таблице:

Назначение

Входные данные

Правильный

ответ

Результат

проверки

1

Проверка выполнения условия неупорядоченности

n=2

a: [5, 12]

k=1

k=1

Правильно

2

Проверка невыполнения условия неупорядоченности

n=2

a:[12, 2]

k=1

k=2

Правильно

3

Проверка условия на граничное значение

n=2

a:[12, 12]

k=1

k=1

Правильно

Замечание. Для испытаний программы на ЭВМ все эти тесты можно объединить в один, поскольку результаты его исполнения будут отображены на экране.

Теперь разработаем алгоритм «Переместить-мин.-элемент-на-позицию-k». Он имеет вид:

План “Переместить-мин.-элемент-на-позицию-k”

Внутренние переменные:

Temp : вещ {буфер обмена}

Начало

Temp := a[k]

a[k] := a[kmin]

a[k] := Temp

Конец

А для проверки его достаточно просто внимательно прочитать текст, чтобы убедиться в его правильности.

Теперь можно объединить полученные планы, получив итоговый алгоритм. Итоговый алгоритм приведен на следующей странице.

Соседние файлы в папке лекции