9. Сортиране
- общи положения; сортиране чрез сравнение
** Класификации на алгоритмите за сортиране [Глава 3, стр.187]
* В зависимост от местонахождението на данните:
- вътрешно (директен достъп), например бързо сортиране и
- външно (последователен достъп), например сливане.
* В зависимост от операцията:
- чрез сравнение (<,
> и ==) на двойки елементи и
- чрез трансформация, напр. сортиране чрез броене.
* Свойство на алгоритъма за сортиране:
- устойчиви - относителният ред на елементите с равни ключове
остава непроменен и
- неустойчиви - разместване на елементи с равни ключове.
(сортиране с 2 ключа)
* Ефективност на алгоритмите за сортиране - брой на извършени сравнения
и размени (присвоявания).
* Използване на допълнителна памет.
** Дърво на сравненията; сортиране на 3 числа.
** Класически универсални елементарни методи за сортиране чрез
сравнение O(n2):
- пряко вмъкване - намираме елемент, който "не е сортиран" и го
поставяме на мястото му в сортираната част;
- пряка селекция (избор) - намираме най-малкия елемент и го
поставяме на мястото му в окончателно сортираната част;
- мехурчето - последователно се разглеждат двойки елементи и
евентуално се разменят.
** Бързо сортиране на Хоор - O(n log2n) средно и O(n2)
в най-лошия
случай.
** Пирамидално сортиране, сортиране чрез сливане: O(n
log2n) и
тази оценка не може да се
подобри при сортиране чрез сравняване.
** Сортиране
чрез трансформация [3.2]
** Сортиране чрез множество [3.2.1]
Дадено е множество M
от числа в затворения интервал [a, b]
и инективна функция за нареждане f:
M -> [a, b], т.е. ако x1 и x2 са
различни, то са различни и f (x1) и f (x2).
Построяваме нулев масив S с индекси от a до b и
с едно минаване през множеството M поставяме
стойности 1
на S[f (x)] за всяко x от M. След това минаваме през
масива S за да
подредим елементите на M.
Сложност O(m+n), където n е броят на елементите на M, а m = b - a + 1.
** Сортиране чрез броене [3.2.2]
** Побитово сортиране [3.2.3]
** Метод на бройните системи [3.2.4]
** Сортиране чрез пермутация [3.2.5]
Дадено е множество M
от n елементи. Означаваме с S множеството {1, 2, 3, ..., n}.
Функцията за нареждане е f: S ->
S е сюрективна, т.е.
ако x1
и x2 са
различни, то са различни и f (x1) и f (x2)
и за
всяко y от S съществува x от S такова, че y = f (x).
Разменяме m[1]
с m[m[1]] докато на 1-во място не дойде 1. После по същия начин с
втория елемент и т.н.
позиции 1234567
4375612
5374612
6374512
1374562
1734562
1234567
Броят
на размените не недвишава n,
а броят на сравненията - 2n.