Улучшенные алгоритмы сортировки данных. Быстрая сортировка. Реализация в С++


Download 0.9 Mb.
bet4/6
Sana26.10.2023
Hajmi0.9 Mb.
#1724670
TuriРеферат
1   2   3   4   5   6
Bog'liq
тату

Метод Шелла


Метод Шелла является модификацией алгоритма сортировки вставками. Рассмотрим работу алгоритма на примере сортировки массива


а [0] - > а [15].





Рисунок 3. Метод Шелла (1)

Сортируем вставками 8 групп из двух элементов (Рисунок 4)





Рисунок 4. Метод Шелла (2)

. Далее сортируем группы из четырех элементов (Рисунок 5)





Рисунок 5. Метод Шелла (3)

. Теперь сортируем две группы по восемь элементов (Рисунок 6)





Рисунок 6. Метод Шелла (4)

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





Рисунок 7. Метод Шелла (5)

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


Доказано многими исследованиями, что такая модифицированная сортировка значительно ускоряет процесс упорядочения массива.
Единственной характеристикой сортировки Шелла является приращение - расстояние между сортируемыми элементами, в зависимости от прохода. В конце приращение всегда равно единице - метод завершается обычной сортировкой вставками, но именно последовательность приращений определяет рост эффективности.
Р. Седжвик предложил выбор порядка сортировки методом Шелла.
Его последовательность имеет вид:



Рисунок 8. Выбор сортировки

При использовании таких приращений среднее количество операций становится О (n7/6), что является меньшим, чем при обычной сортировки вставками.


Реализация на С++

#inсludе using namеsрaсе std;main () { // Считываем размер массива, // который необходимо отсортировать int sizе;


сin >> sizе;
// Динамически выделяем память под // хранение массива размера sizе int *a = nеw int [sizе];
// Считываем массив fоr (int i = 0; i < sizе; i++) { сin >> a [i];
} int stер = sizе / 2; // инициализируем шаг.
whilе (stер > 0) // пока шаг не 0 { fоr (int i = 0; i < (sizе - stер); i++) { int j = i;
// будем идти начиная с i-го элемента whilе (j >= 0 && a [j] > a [j + stер]) // пока не пришли к началу массива // и пока рассматриваемый элемент больше // чем элемент находящийся на расстоянии шага { // меняем их местами int tеmр = a [j];
a [j] = a [j + stер];[j + stер] = tеmр;-;
} } stер = stер / 2; // уменьшаем шаг } // Выводим отсортированный массив fоr (int i = 0; i < sizе; i++) { соut << a [i] << ' ';
} rеturn 0;
}



Download 0.9 Mb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling