
- •Вопрос 57: Пользовательские типы данных. Тип struct. Массивы структур.
- •Вопрос 58: Объединения (union). Битовые поля.
- •Сложность этой программы о(n2). Сложность ниже приведенного алгоритма o(n3).
- •Вопрос 60: Алгоритмы сортировки и поиска. Обменные сортировки. Сортировки вставками. Сортировки выбором. Сравнительный анализ методов сортировки.
- •2. Алгоритмы сортировки
- •2.1. Обменные сортировки
- •2.1.1. Метод пузырька
- •2.1.2. “Быстрая сортировка” или обменная с разделением
- •2.1.3.Шейкерная сортировка
- •2.2. Сортировка вставками
- •2.3 Сортировка выбором
- •В этом алгоритме использована дополнительная память. При экономии памяти алгоритм будет следующий:
- •Выбор метода сортировки
2. Алгоритмы сортировки
Сортировка — это упорядочивание набора однотипных данных по возрастанию или убыванию. При необходимости отсортировать данные многие программисты просто вызывают стандартную функцию qsort(), входящую в стандартную библиотеку stdlib.h. Однако различные подходы к сортировке обладают разными характеристиками. Несмотря на то, что некоторые способы сортировки могут быть в среднем лучше, чем другие, ни один алгоритм не является идеальным для всех случаев.
Существует три общих метода сортировки массивов:
Обмен
Вставка
Выбор
Чтобы понять, как работают эти методы, представьте себе колоду игральных карт. Чтобы отсортировать карты методом обмена, разложите их на столе лицом вверх и меняйте местами карты, расположенные не по порядку, пока вся колода не будет упорядочена. В методе выбора разложите карты на столе, выберите карту наименьшей значимости и положите ее в руку. Затем из оставшихся карт снова выберите карту наименьшей значимости и положите ее на ту, которая уже находится у вас в руке. Процесс повторяется до тех пор, пока в руке не окажутся все карты; по окончании процесса колода будет отсортирована. Чтобы отсортировать колоду методом вставки, возьмите все карты в руку. Выкладывайте их по одной на стол, вставляя каждую следующую карту в соответствующую позицию. Когда все карты окажутся на столе, колода будет отсортирована.
2.1. Обменные сортировки
Предусматривает систематический обмен местами между элементами пар, в которых нарушается упорядоченность до тех пор, пока таких пар не останется.
2.1.1. Метод пузырька
Наиболее очевидный метод обменной сортировки. Кi сравнивается с Кi+1, если ключи не упорядочены, то Ri меняется местами с Ri+1, затем Кi+1 сравнивается с Кi+2 и т.д. В результате первого просмотра запись с наибольшим ключом займет самое правое положение, т.е. место записи RN. За 2-ой просмотр запись со следующим по величине ключом займет место RN-1 и т.д. В конце концов, все записи окажутся упорядоченными.
Если файл чисел расположить не горизонтально, а вертикально, то станет ясно, почему этот метод носит название метод пузырька – наибольшие элементы всплывают вверх. Видно, что после каждого просмотра файла все записи, начиная с самой последней, которая участвовала в обмене и выше, занимают свои окончательные позиции, и нет смысла их проверять при последующих просмотрах. На рисунке эта граница отмечена черточками.
2.1.2. “Быстрая сортировка” или обменная с разделением
Каждое предыдущее сравнение используется для определения, какие ключи сравнивать следующими. Берем два указателя i и j. Полагаем i:=1; j:=N.
Сравниваем Ki и Kj. Если обмен не требуется уменьшаем j на единицу и повторяем процесс. После первого обмена увеличим i на единицу. Продолжаем сравнения, увеличивая i на единицу до следующего обмена. Тогда опять уменьшаем j на единицу и т.д., будем сжигать овечку с обоих концов, пока не станет i=j. К этому моменту исходная запись R1 займет свое место, ибо слева от нее не будет больших ключей, а справа – меньших. Исходные данные окажутся разделенными на две части, к каждой из которых можно применить такой же метод.
i=1 10 40 04 05 01 21 06 03 17 25 j=10 уменьшить j
10 40 04 05 01 21 06 03 17 25 j=9 уменьшить j
10 40 04 05 01 21 06 03 17 25 обмен
увеличить i
03 40 04 05 01 21 06 10 17 25 обмен
уменьшить j
03 10 04 05 01 21 06 40 17 25 обмен
увеличить i
03 06 04 05 01 21 10 40 17 25
увеличить i
03 06 04 05 01 21 10 40 17 25
увеличить i
03 06 04 05 01 21 10 40 17 25
увеличить i
03 06 04 05 01 21 10 40 17 25 обмен
уменьшить j
03 06 04 05 01 10 21 40 17 25 i=j
03 06 04 05 01 10 21 40 17 25
01 06 04 05 03 10 21 40 17 25
01 03 04 05 06 10 17 40 21 25
01 03 04 05 06 10 17 21 40 25
01 03 04 05 06 10 17 21 40 25
01 03 04 05 06 10 17 21 25 40
Для этого метода легко написать рекурсивную процедуру и довольно сложно – не рекурсивную.
Количество сравнений для неупорядоченных данных – N*log2N и N2 для упорядоченных.