Алгоритъм за сортиране: Разлика между версии
Изтрито е съдържание Добавено е съдържание
Shegobieca (беседа | приноси) |
м мкор |
||
Ред 1:
'''Алгоритъм за сортиране''' е [[алгоритъм]], който подрежда списък от елементи в определена последователност. Най-използваните подредби са числовите и лексикографските подредби. Ефективните алгоритми за сортиране са важни за оптимизацията на други алгоритми (например [[алгоритми за търсене]], [[алгоритми за сливане]] и др.), който изискват [[входните данни]] да са сортирани в определена последователност. Често също така е полезно за конкатенизиране (сливане) на данни и за генериране на разбираеми за човек крайни резултати. Формално казано, изходният резултат от [[алгоритъм за сортиране]] трябва да задоволява две условия:
# Изходният резултат е в ненамаляваща последователност (всеки елемент не трябва да е по
# Изходният резултат е пермутация (пренаредба) на входните елементи.
От раждането на компютърните науки, алгоритмите за сортиране са
==Класификация==
Сортиращите алгоритми често се класифицират по:
* [[Теория на изчислителната сложност|Изчислителна сложност]] при сравняване на елементите (най-лош, среден и най-добър случай) при сравняване на елементи в списък от (''n'') елемента. Добър пример за серийно сортиране O(''n'' log ''n''), за паралелно сортиране O(log<sup>2</sup> ''n''), и за лошо сортиране O(''n''<sup>2</sup>). Вижте нотацията на [[голямото '''О''']]. Идеалният резултат при серийно сортиране е O(''n''), но това не е постижимо в повечето случаи. Оптималното паралелно сортиране е O(log ''n''). Сравняващо-базираните алгоритми за сортиране, които оценяват
* Използвана памет (и други компютърни ресурси)
* [[Рекурсия|Рекурсивни]].
* Стабилност
* Дали са сравняващи алгоритми - сравняващите алгоритми сравняват два елемента с оператор за сравнение
Ред 17:
===Стабилност===
[[File:Sorting stability playing cards.svg|thumb|Пример за стабилно сортиране с карти за игра. Когато картите са сортирани по ранг чрез стабилно сортиране, двете петици би следвало да останат в началната си последователност. Когато сортирането е нестабилно, двете петици могат да разменят местата си понякога в
Когато се сортират някакви данни, само част от техните признаци се анализират при тяхното подреждане. Примерът от дясно показва, че картите са сортирани по ранг (от 2 до 7), а техният цвят се игнорира. От това следва, че крайният резултат може да бъде различен. Алгоритмите за стабилно сортиране използват следното правило: ако два елемента при сравнение са еднакви (като например двете петици), то тяхната първоначална подредба ще бъде съхранена, така че ако едната от тях е преди другата в началната подредба, то тя ще бъде първа и в крайният резултат.
Когато еднаквите елементи са неразличими, като целочислените числа или други по-общи данни където всеки елемент е уникален по всичките си признаци, стабилността не е проблем. Стабилността не е проблем и когато всички елементи са различни.
Нестабилното сортиране може да бъде превърнато в стабилно чрез допълнително разширяване логиката за сравняване, така че сравняването на два елемента, които по един признак са еднакви, да бъдат различени по един или повече други признаци. Това допълнително разширение обаче води до нуждата от допълнително време и памет.
Един подход за стабилно сортиращи алгоритми е сортиране на списъци по първичен и вторичен ключ. Например,
[[File:Sorting playing cards using stable sort.svg|400px]]
Размяната на ключовете може обаче да доведе до нестабилно сортиране. Отново примера с картите – ако първо се сравнява по цвят, а после по ранг, не винаги крайният резултат ще бъде един и същ.
===Сравнение на алгоритмите===
В таблицата, ''n'' е номерата на записи, които трябва да се сортират. Колоните "Средно" и "Най-лошо" показват времевата сложност (също така наречена [[Теория на изчислителната сложност|изчислителна сложност]]) на всеки от алгоритмите. Колоната "Памет" е за паметта, която се изисква, както допълнение към базовата памет (съхраняваща списъка с елементи), необходима за извършване операции и преподредба на елементите при
{|class="wikitable sortable"
Ред 53:
|style="background:#ddffdd"|{{Sort|20|<math>\mathcal{} n \log n</math>}}
|style="background:#ffdddd"|{{Sort|25|<math>\mathcal{} n^2</math>}}
|style="background:#ffffdd"|{{Sort|05|<math>\mathcal{} \log n</math> при среден, <math>n</math> в най-
|style="background:#ffffdd"| Зависи
| разделяне
Ред 62:
|style="background:#ddffdd"|{{Sort|20|<math>\mathcal{} {n \log n} </math>}}
|style="background:#ddffdd"|{{Sort|20|<math>\mathcal{} {n \log n} </math>}}
|style="background:#ffdddd"|{{Sort|15|Зависи; в най-
|style="background:#ddffdd"| Да
| сливане
Ред 101:
|style="background:#ffdddd"| Не
| вмъкване
|align=left| Малък блок код, без Small code size, не използва стек на извикванията, разумно бърз, полезен, където паметта е приоритет, като например вградените и по-старите майнфрейм приложения
|- align="center"
|[[Метод на мехурчето]]
Ред 129:
{{Main|Метод на мехурчето}}
''Методът на мехурчето'' ({{lang-en|Bubble sort}}) е прост сортиращ алгоритъм. Алгоритъмът започва в началото на
===Сортиране чрез пряка селекция===
[[Image:Selection sort animation.gif|150px|right|thumb| Сортиране чрез пряка селекция]]
{{Main|Сортиране чрез пряка селекция}}
Алгоритъмът намира най-малкия елемент в списъка и го разменя с
===Сортиране чрез вмъкване===
{{Main|Сортиране чрез вмъкване}}
''Сортирането чрез вмъкване'' ({{lang-en|Insertion sort}}) е прост алгоритъм, който е относително ефективен при малки и
===Шел сортиране===
{{Main|Шел сортиране}}
''Шел сортирането'' е открито от Доналд Шел през 1959 година. То подобрява
===Сортиране чрез сливане===
{{Main|Сортиране чрез сливане}}
''Сортирането чрез сливане'' ({{lang-en|Merge sort}}) използва принципа на сливане на вече сортирани списъци. Започва
===Пирамидално сортиране===
[[Image:Max-Heap.svg|150px|right|thumb|Пример за хийп двоично дърво]]
{{Main|Пирамидално сортиране}}
''Пирамидалното сортиране''({{lang-en|Heapsort}}) е много по-ефективно от [[Сортиране чрез пряка селекция|Сортирането чрез пряка селекция]]. Този вид сортиране на принципа на определяне на най-малкия и най-големия елемент в списъка и поставянето им в двата края, след което прави същото и за останалата част на несортирания списък. За да се реализира този алгоритъм, несортираният списък
===Сортиране чрез броене===
Ред 168:
==Модели за използване на паметта и сортиране чрез индекси==
Когато размерът на
Например популярният алгоритъм за сортиране [[бързо сортиране]] предлага достатъчно добра производителност при налична оперативна памет, но заради рекурсивната си природа този алгоритъм прави прекалено много копия на сортиращият се масив и когато излезе извън границите на оперативната си памет и започне да се използва
Един начин да се заобиколи този проблем, който работи добре при по-сложните записи (като например [[Релационна база данни|релационните бази данни]]), е списъците да се сортират по относително малки по обем ключове (индекси), вместо целите записи. След това с едно обхождане могат да се сортират всички записи на базата на техните индекси, въпреки че това не е необходимо тъй като индексите сочат към съответните си записи. Такова сортиране се нарича още така "тагово сортиране".
Друг подход за решаване на проблема с паметта е да се комбинират няколко сортиращи алгоритъма така, че да се използват само силните им страни.
|