Алгоритм сортировки включением
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Такой метод сортировки часто используется при игре в карты. Элементы (карты) мысленно делятся на «уже готовую» последовательность a1,..., аi-1 и исходную последовательность. При каждом шаге, начиная с i=2 и увеличивая i каждый раз на единицу, из исходной последовательности извлекается i элемент и перекладывается в готовую последовательность, при этом он вставляется на нужное место.

Пример сортировки с помощью прямого включения

 

Элементы массива:  44 55 12  42   94  18  06   67

i=2                   44 55 12 42 94 18 06  67 (55 остался на месте)

i=3                 12 44 55 42 94 18 06 67 (12 перешел на 1 ячейку)

i=4                 12 42 44 55 94  18 06 67   (42 перешел на 2 ячейку)

i=5                 12 42 44 55 94 18  06 67 (94 остался на месте)

i=6                 12 18 42 44 55 94 06  67 (18 перешел на 2 ячейку)

i=7                 06 12 18 42 44 55 94 67   (06 перешел на 1 ячейку)

i=8                06 12 18 42 44 55 67 94  (67 перешел на 7 ячейку)

     

Идея алгоритма этой сортировки такова:

{для каждого элемента, начиная со второго}

x := a[i];

включение x  на соответствующее место среди a[1] … a[i];

 

В реальном процессе поиска подходящего места удобно, чередуя сравнения и движения по последовательности, как бы просеивать x, т.е. x сравнивается с очередным предыдущим элементом aj , а затем либо x вставляется на свободное место, либо aj сдвигается (передается) вправо и процесс «уходит» влево. Следует обратить внимание, что процесс просеивания может закончиться при выполнении одного из двух условий:

ü найден элемент aj со значением, меньшим, чем x;

ü достигнут левый конец готовой последовательности.

 

Это типичный пример цикла с двумя условиями окончания, что дает возможность применить известный прием фиктивного элемента («барьера»). Его можно реализовать, установив барьер a0 = x , для чего следует расширить диапазон индексов массива a [0.. n].

 

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

В 1959 г. Д.Шеллом было предложено усовершенствование сортировки с помощью прямого включения. Суть метода в следующем: сначала отдельно группируются и сортируются элементы, отстоящие друг от друга на расстоянии 4. Такой процесс называется четверной сортировкой. После первого прохода элементы перегруппировываются. Теперь каждый элемент группы отстоит от другого элемента группы на две позиции - и элементы вновь сортируются. Это называется двойной сортировкой. И, наконец, на третьем проходе идет обычная, или одинарная сортировка.

Такой метод в результате дает упорядоченный массив, и видно, что каждый проход от предыдущего только выигрывает (так как каждая i-я сортировка объединяет две группы, уже отсортированные 2 i-сортировкой). Очевидно, что расстояния в группах можно уменьшать по-разному, лишь бы последнее было единичным, ведь в самом плохом случае последний проход и сделает всю работу.

 

Пример сортировки

 

Исходный массив:

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

 

На самом деле значение шага сортировки можно (и нужно) варьировать. В общем случае при сортировке Шелла сначала сравниваются и сортируются между собой значения, стоящие один от другого на некотором расстоянии d. После этого процедура повторяется для некоторых меньших значений шага, а завершается сортировка Шелла упорядочиванием элементов при d=1 (то есть обычной сортировкой вставками). Эффективность сортировки Шелла в определённых случаях обеспечивается тем, что элементы «быстрее» встают на свои места.

Невзирая на то, что сортировка Шелла во многих случаях медленнее, чем быстрая сортировка, она имеет ряд преимуществ:

ü отсутствие потребности в памяти под стек;

ü отсутствие деградации при неудачных наборах данных — быстрая сортировка легко деградирует до сложности O(n²), что хуже, чем худшее гарантированное время для сортировки Шелла.

 

 


Список литературы

1. Круглински Д., Уингоу С., Шеферд Дж. Программирование на Microsoft Visual C++ для профессионалов/Пер. с англ. – СПб:Питер; М.: Издательско-торговый дом "Русская редакция", 2000. - 864с.

2. Холзнер С. Visual C++ 6: учебный курс – СПб.: Изд-во «Питер», 2000. – 576с.

3. Конспект лекций в файле VC_Lect.doc

4. Овсянник_Язык_С++_не_для_чайников.doc

5. Кравець П.О. Об’єктно-орієнтоване програмування: навч. посібник/ П.О.Кравець. – Львів: Видавництво Львівської політехніки, 2012. – 624с.

 

 


 



Дата: 2019-07-30, просмотров: 218.