Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ponyatie_slozhnosti_algoritma.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
147.01 Кб
Скачать
  1. Сортировка с помощью включения.

Элементы мысленно делятся на уже готовую последовательность (от a0 до ai) и исходную. На кажд шаге, начиная с первого, i увеличив на 1, из исходн. последовательнос извлекается i-ый эл-т и перекладывается в готовую послед-ть, при этом он вставл-ся на нужное место.

i = 1 44 55 12 42 94 18 06 67

i = 2 44 55 12 42 94 18 06 67

i = 3 12 44 55 42 94 18 06 67

i = 4 12 42 44 55 94 18 06 67

i = 5 12 42 44 55 94 18 06 67

i = 6 12 18 42 44 55 94 06 67

i = 7 06 12 18 42 44 55 94 67

i = 8 06 12 18 42 44 55 67 94

Вставка эл-та на очередн.шаге осуществляется путем последоват. сравнений с эл-том, стоящим перед ним.

void insertSort(int* a, long size) {

int x;

long i, j;

for(i =0; i < size; i++) {

x = a[i];

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

a[j+1] = a[j];

a[j+1] = x; } }

  1. Сортировка с помощью выделения

Описание:

  1. Выбирается min-ый эл-т

  2. Он меняется местами с 1-ым эл-том

  3. Этот процесс повторяется с оставшимися элементами

void selectSort(int* a, long size) {

int x, minE, minP;

long i, j;

for(i=0; i < size; i++) {

x = a[i];

minE = 0;

for(j = i; j < size; j++)

if(a[j] < minE)

{ minE = a[j]; minP = j; }

a[i] = minE;

a[minP] = x; } }

  1. Сортировка с помощью обменов

Идея: проход снизу вверх по массиву. По пути просматриваются пары соседних эл-тов. Если эл-ты некоторой пары находятся в неправильном порядке, они меняются местами.

Следующий проход делается до второго сверху эл-та и т.д, проходы по уменьшающейся нижней части делаются до тех пор, пока там не останется один эл-т

void bubbleSort(int a[], long size)

{

long i, j;

int x;

for(i = 0; i < size; i++) { // i - номер прохода

for(j = size-1; j > i; j--) {

if ( a[j-1] > a[j] ) {

x=a[j-1]; a[j-1]=a[j]; a[j]=x; }

} } }

  1. Шейкерная сортировка

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

Это улучшение можно еще улучшить, если запомнить не только сам факт обмена, но и индекс последнего обмена.

Все пары соседних элементов выше этого индекса находятся в желаемом порядке, поэтому просмотры можно заканчивать на этом индексе, а не идти до заранее определенного нижнего предела.

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

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

В 1959г. Шелл усовершенствовал сортировку вставкой.

Сначала отдельно группируются и сортируются эл-ты, отстоящие друг от друга на половину размера массива – на 4.

44 55 12 42 94 18 06 67

44 18 06 42 94 55 12 67

На втором шаге перегруппировываются группы отстоящие друг от друга на две позиции

06 18 12 42 44 55 94 67

На последнем шаге обычная сортировка включением

06 12 18 42 44 55 67 94

void sort_shell(int *a,int N) {

for(int d=N/2; d > 0; d/=2)

for(int i=d; i < N; i++)

for(int j = i; j>=d && a[j - d] > a[j]; j -= d)

swap(a[j], a[j-d]);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]