Основно съдържание
Компютърни науки
Курс: Компютърни науки > Раздел 1
Урок 8: Сортиране чрез сливане- Алгоритми "разделяй и владей"
- Преглед на сортиране чрез сливане
- Предизвикателство: Имплементация на сортиране чрез сливане
- Сливане с линейно време
- Предизвикателство: Имплементация на сливане
- Анализ на сортиране чрез сливане
© 2023 Khan AcademyУсловия за ползванеДекларация за поверителностПолитика за Бисквитки
Алгоритми "разделяй и владей"
Двата алгоритъма за сортиране, които разгледахме досега, сортиране чрез пряка селекция (selection sort) и сортиране чрез вмъкване (insertion sort), имат най-лошо време за изпълнение \Theta, left parenthesis, n, squared, right parenthesis. Когато размерът на входния масив е голям, изпълнението на тези алгоритми може да отнеме много време. В този и в следващия урок ще разгледаме други два алгоритъма за сортиране, сортиране чрез сливане (merge sort) и бързо сортиране (quick sort), които имат по-добро време за изпълнение. По-конкретно, сортиране чрез сливане се изпълнява за време \Theta, left parenthesis, n, \lg, n, right parenthesis във всички случаи, а бързото сортиране се изпълнява за време \Theta, left parenthesis, n, \lg, n, right parenthesis в най-добрия случай, а времето за изпълнение в най-лошия случай е \Theta, left parenthesis, n, squared, right parenthesis. На таблицата са представени четирите алгоритъма със съответното им време за изпълнение:
Алгоритъм | Най-лошо време за изпълнение | Най-добро време за изпълнение | Средно време за изпълнение |
---|---|---|---|
Сортиране чрез пряка селекция | \Theta, left parenthesis, n, squared, right parenthesis | \Theta, left parenthesis, n, squared, right parenthesis | \Theta, left parenthesis, n, squared, right parenthesis |
Сортиране чрез вмъкване | \Theta, left parenthesis, n, squared, right parenthesis | в, р, е, м, е, \Theta, left parenthesis, n, right parenthesis | \Theta, left parenthesis, n, squared, right parenthesis |
Сортране чрез сливане | \Theta, left parenthesis, n, \lg, n, right parenthesis | \Theta, left parenthesis, n, \lg, n, right parenthesis | \Theta, left parenthesis, n, \lg, n, right parenthesis |
Бързо сортиране | \Theta, left parenthesis, n, squared, right parenthesis | \Theta, left parenthesis, n, \lg, n, right parenthesis | \Theta, left parenthesis, n, \lg, n, right parenthesis |
Разделяй и владей
И двата алгоритъма споделят обща алгоритмична парадигма, базирана на рекурсия. Тази парадигма, наречена разделяй и владей разделя задачата на подзадачи, които са подобни на първоначалната задача, решава ги рекурентно и накрая комбинира решението, за да реши първоначалната задача. Тъй като "разделяй и владей" решава подзадачите рекурентно, всяка подзадача трябва да е по-малка от първоначалната задача и трябва да има базов случай за всяка подзадача. Алгоритъмът "разделяй и владей" може да се раздели на 3 части:
- Разделя задачата на подзадачи, които са по-малки инстанции на същата задача.
- Овладява подзадачите, като ги решава рекурентно. Ако са достатъчно малки, решава подзадачите като базови случаи.
- Комбинира решенията на подзадачите в решение на първоначалната задача.
Можеш лесно да запомниш стъпките на алгоритъма "разделяй и владей", като разделяй, владей, комбинирай. Ето как можем да представим една стъпка, като приемем, че всяка стъпка на разделяне създава две подзадачи (макар че някои алгоритми "разделяй и владей" могат да създадат повече от две):
Ако разширим с още две рекурентни стъпки, ще изглежда така:
Тъй като алгоритъмът "разделяй и владей" създава поне две подзадачи, този алгоритъм прави няколко рекурентни извиквания.
Това съдържание е резултат от съвместната дейност на преподавателите по Компютърни науки в Дартмут Thomas Cormen и Devin Balkcom, както и на екипа по компютърни науки на Кан Академия. Съдържанието е лицензирано CC-BY-NC-SA.
Искаш ли да се присъединиш към разговора?
Все още няма публикации.