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

Смысл данного алгоритма сводится к следующему:

  1. Задаем номер места К в последовательности, на которое нужно будет поместить очередной упорядочиваемый элемент.

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

  3. Меняем его местами с тем, который находится на К-ом месте.

  4. Все указанные операции повторяются до тех пор, пока не упорядочим всю последовательность.

Блок-схема алгоритма сортировки данным методом приведена на рисунке 2.

Рисунок 2 – Блок-схема сортировки последовательности по убыванию значений методом выборки максимального элемента

    1. Сортировка методом Шелла

Основная идея сортировки по Шеллу заключается в том, что сначала сравниваются удаленные друг от друга элементы, а не смежные, как в методе «пузырька». Это приводит к быстрому устранению большей части неупорядоченности и сокращает последующую работу. Интервал между элементами постепенно сокращается до единицы, когда сортировка фактически превращается в метод перестановки соседних элементов.

На блок-схеме, приведенной на рисунке 3, представлен алгоритм сортировки последовательности D, состоящей из N элементов.

Рисунок 3 – Блок-схема сортировки последовательности по убыванию значений методом Шелла.

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

Так как интервал sh в конце концов сводится к единице, все элементы в результате упорядочиваются правильно. /Описание взято из: Карниган Б., Ритчи Д. Язык программирования Си./

    1. Другие алгоритмы сортировки. Сравнение алгоритмов

Конечно же, на самом деле алгоритмы сортировки не ограничиваются методами, изложенными выше. В статье С. Курковского “Алгоритмы сортировки” (журнал “Монитор”, №6-7, 1992г.) приведены также метод Хоора, называемый также быстрой сортировкой, и метод сортировки с помощью бинарного дерева. Оттуда же взята диаграмма, на которой сравнивается быстродействие этих алгоритмов (рисунок ).

Рисунок 4

Очевидно, что для организации перебора неотсортированной части последовательности полезно применить цикл. Кроме того, еще один цикл (очевидно, внешний) будет "отвечать" за номер элемента, который "становится на свое место" в данный момент. Поэтому вспомним, как организуются операторы цикла в языке СИ.

  1. Операторы циклов

Циклом называется последовательность операторов, которая выполняется несколько раз в процессе выполнения программы при различных значениях некоторой переменной или при выполнении какого-то условия. Например, необходимо вычислить среднее значение последовательности а0, а1, а2, … а10.

В этом случае в программе можно написать следующее:

float a[10], sum, sr;

sum = 0;

sum = sum + a[0];

sum = sum + a[1];

. . .

sum = sum + a[9];

sr = sum/10;

Собственно для подсчета суммы необходимо написать 10 операторов присваивания, имеющих одинаковый вид и отличающихся только индексами текущих элементов массива. А что делать, если длина последовательности не 10, а 100? Или конкретное количество обрабатываемых элементов вводится пользователем уже в ходе выполнения вашей программы? В последнем случае просто неизвестно заранее, сколько операторов присваивания нужно выполнить. В этом случае на помощь и приходит такой инструмент, как цикл.

В этом случае алгоритм для расчета суммы первых N элементов последовательности А и вычисления затем среднего значения можно записать следующим образом:

  1. Задаём начальное значение для суммы, равное нулю (СУММА = 0).

  2. Задаем начальный номер элемента массива, например, 1 (ИНДЕКС = 1).

  3. К сумме добавляем значение элемента массива с номером ИНДЕКС (СУММА = СУММА + А[ИНДЕКС]).

  4. Увеличиваем ИНДЕКС на 1 (ИНДЕКС = ИНДЕКС + 1).

  5. Проверяем, не вышли ли за пределы массива (ИНДЕКС<=N ?).

  6. В случае результата “истина” возвращаемся к п.№3, в случае результата “ложь” переходим к следующему пункту (в нашем случае №7).

  7. Вычисляем среднее (СРЕДНЕЕ = СУММА / N).

Блок-схема алгоритма приведена на рисунке 5.

Рисунок 5 – Алгоритм расчета суммы последовательности А длиной N

Повторяющиеся действия (п.3, 4, 5) и будут выполняться циклически.

В языке Си реализовано три вида циклов: while(), for() и do ... while(). С учетом этого, варианты реализации приведенного выше примера приведены в таблице 1:

Таблица 1

С использованием оператора for()

С использованием оператора while()

С использованием оператора do... while()

С использованием операторов if и goto

sum = 0;

for (i=0; i<n; i++)

{

sum = sum + a[i];

}

sr = sum/10;

i = 0; sum = 0;

while ( i < n )

{

sum = sum + a[i];

i++;

}

sr = sum/10;

i = 0; sum = 0;

do

{

sum = sum + a[i];

i++;

}

while ( i < n );

sr = sum/10;

i = 0; sum = 0;

m:

sum = sum + a[i];

i++;

if ( i < n ) goto m;

sr = sum/10;

Соседние файлы в папке Методические указания