Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры и алгоритмы / Сортировка_Основные алгоритмы.doc
Скачиваний:
113
Добавлен:
23.02.2015
Размер:
679.94 Кб
Скачать
    1. Сортировка вставками

Одним из наиболее простых и естественных методов внутренней сортировки является сортировка с простыми включениями или вставками. Идея алгоритма очень проста. Пусть имеется массив ключей a[1], a[2], ..., a[n].Для каждого элемента массива, начиная со второго, производится сравнение с элементами с меньшим индексом (элементa[i]последовательно сравнивается с элементамиa[i-1], a[i-2]...) и до тех пор, пока для очередного элементаa[j]выполняется соотношениеa[j] > a[i], a[i]иa[j]меняются местами. Если удается встретить такой элементa[j],чтоa[j] <= a[i], или если достигнута нижняя граница массива, производится переход к обработке элементаa[i+1](пока не будет достигнута верхняя граница массива).

Аналогичным образом делаются проходы по части массива, и аналогичным же образом в его начале "вырастает" отсортированная последовательность.

Однако в сортировке «пузырьком» или «выбором» можно было четко заявить, что на i-м шаге элементыa[0]...a[i]стоят на правильных местах и никуда более не переместятся. Здесь же подобное утверждение будет более слабым: последовательностьa[0]...a[i]упорядочена. При этом по ходу алгоритма в нее будут вставляться все новые элементы.

На i-м шаге работы алгоритма последовательность разделена на две части: готовуюa[0]...a[i]и неупорядоченнуюa[i+1]...a[n].

На следующем, (i+1)-м каждом шаге алгоритма беремa[i+1]и вставляем на нужное место в готовую часть массива. Поиск подходящего места для очередного элемента входной последовательности осуществляется путем последовательных сравнений с элементом, стоящим перед ним. В зависимости от результата сравнения элемент либо остается на текущем месте (вставка завершена), либо они меняются местами и процесс повторяется (рис. 8).

0

1

3

4

2

7

9

Последовательность на текущий момент. Часть a[0]…a[2] уже упорядочена.

2 ↔ 4

2 ↔ 3

Вставка завершена

0

1

3

2

4

7

9

0

1

2

3

4

7

9

0

1

2

3

4

7

9

Вставка числа 2 в отсортированную подпоследовательность. Сравниваемые пары выделены

Рис. 8

Таким образом, в процессе вставки мы "просеиваем" элемент xк началу массива, останавливаясь в случае, когда:

  1. найден элемент, меньший x, или

  2. достигнуто начало последовательности.

Иногда этот метод называют сортировкой «просеиванием».

template<class T>

void insertSort(T a[], long size) {

T x;

long i, j;

for(i=0;i<size;i++) { // цикл проходов,i- номер прохода

x=a[i]; // поиск места элемента в готовой последовательности

for ( j=i-1; j>=0 && a[j] > x; j--)

a[j+1] = a[j]; // сдвигаем элемент направо, пока не дошли

// место найдено, вставить элемент

a[j+1] = x;

}

}

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

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