[{"data":1,"prerenderedAt":2284},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fpython\u002Fst28":386,"\u002Fblog\u002Fpython\u002Fst28-surround":2279},[4],{"title":5,"path":6,"stem":7,"children":8,"page":114},"Blog","\u002Fblog","blog",[9,115,184,329],{"title":10,"path":11,"stem":12,"children":13,"page":114},"Ege","\u002Fblog\u002Fege","blog\u002Fege",[14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86,90,94,98,102,106,110],{"title":15,"path":16,"stem":17},"ЕГЭ Задание 1","\u002Fblog\u002Fege\u002Ftask1","blog\u002Fege\u002Ftask1",{"title":19,"path":20,"stem":21},"ЕГЭ Задание 10","\u002Fblog\u002Fege\u002Ftask10","blog\u002Fege\u002Ftask10",{"title":23,"path":24,"stem":25},"ЕГЭ Задание 11","\u002Fblog\u002Fege\u002Ftask11","blog\u002Fege\u002Ftask11",{"title":27,"path":28,"stem":29},"ЕГЭ Задание 12","\u002Fblog\u002Fege\u002Ftask12","blog\u002Fege\u002Ftask12",{"title":31,"path":32,"stem":33},"ЕГЭ Задание 13","\u002Fblog\u002Fege\u002Ftask13","blog\u002Fege\u002Ftask13",{"title":35,"path":36,"stem":37},"ЕГЭ Задание 14","\u002Fblog\u002Fege\u002Ftask14","blog\u002Fege\u002Ftask14",{"title":39,"path":40,"stem":41},"ЕГЭ Задание 15","\u002Fblog\u002Fege\u002Ftask15","blog\u002Fege\u002Ftask15",{"title":43,"path":44,"stem":45},"ЕГЭ Задание 16","\u002Fblog\u002Fege\u002Ftask16","blog\u002Fege\u002Ftask16",{"title":47,"path":48,"stem":49},"ЕГЭ Задание 17","\u002Fblog\u002Fege\u002Ftask17","blog\u002Fege\u002Ftask17",{"title":51,"path":52,"stem":53},"ЕГЭ Задание 18","\u002Fblog\u002Fege\u002Ftask18","blog\u002Fege\u002Ftask18",{"title":55,"path":56,"stem":57},"ЕГЭ Задание 19, 20, 21","\u002Fblog\u002Fege\u002Ftask19_20_21","blog\u002Fege\u002Ftask19_20_21",{"title":59,"path":60,"stem":61},"ЕГЭ Задание 2","\u002Fblog\u002Fege\u002Ftask2","blog\u002Fege\u002Ftask2",{"title":63,"path":64,"stem":65},"ЕГЭ Задание 22","\u002Fblog\u002Fege\u002Ftask22","blog\u002Fege\u002Ftask22",{"title":67,"path":68,"stem":69},"ЕГЭ Задание 23","\u002Fblog\u002Fege\u002Ftask23","blog\u002Fege\u002Ftask23",{"title":71,"path":72,"stem":73},"ЕГЭ Задание 24","\u002Fblog\u002Fege\u002Ftask24","blog\u002Fege\u002Ftask24",{"title":75,"path":76,"stem":77},"ЕГЭ Задание 25","\u002Fblog\u002Fege\u002Ftask25","blog\u002Fege\u002Ftask25",{"title":79,"path":80,"stem":81},"ЕГЭ Задание 26","\u002Fblog\u002Fege\u002Ftask26","blog\u002Fege\u002Ftask26",{"title":83,"path":84,"stem":85},"ЕГЭ Задание 27","\u002Fblog\u002Fege\u002Ftask27","blog\u002Fege\u002Ftask27",{"title":87,"path":88,"stem":89},"ЕГЭ Задание 3","\u002Fblog\u002Fege\u002Ftask3","blog\u002Fege\u002Ftask3",{"title":91,"path":92,"stem":93},"ЕГЭ Задание 4","\u002Fblog\u002Fege\u002Ftask4","blog\u002Fege\u002Ftask4",{"title":95,"path":96,"stem":97},"ЕГЭ Задание 5","\u002Fblog\u002Fege\u002Ftask5","blog\u002Fege\u002Ftask5",{"title":99,"path":100,"stem":101},"ЕГЭ Задание 6","\u002Fblog\u002Fege\u002Ftask6","blog\u002Fege\u002Ftask6",{"title":103,"path":104,"stem":105},"ЕГЭ Задание 7","\u002Fblog\u002Fege\u002Ftask7","blog\u002Fege\u002Ftask7",{"title":107,"path":108,"stem":109},"ЕГЭ Задание 8","\u002Fblog\u002Fege\u002Ftask8","blog\u002Fege\u002Ftask8",{"title":111,"path":112,"stem":113},"ЕГЭ Задание 9","\u002Fblog\u002Fege\u002Ftask9","blog\u002Fege\u002Ftask9",false,{"title":116,"path":117,"stem":118,"children":119,"page":114},"Oge","\u002Fblog\u002Foge","blog\u002Foge",[120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180],{"title":121,"path":122,"stem":123},"ОГЭ Задание 1","\u002Fblog\u002Foge\u002Ftask1","blog\u002Foge\u002Ftask1",{"title":125,"path":126,"stem":127},"ОГЭ Задание 10","\u002Fblog\u002Foge\u002Ftask10","blog\u002Foge\u002Ftask10",{"title":129,"path":130,"stem":131},"ОГЭ Задание 11","\u002Fblog\u002Foge\u002Ftask11","blog\u002Foge\u002Ftask11",{"title":133,"path":134,"stem":135},"ОГЭ Задание 12","\u002Fblog\u002Foge\u002Ftask12","blog\u002Foge\u002Ftask12",{"title":137,"path":138,"stem":139},"ОГЭ Задание 13","\u002Fblog\u002Foge\u002Ftask13","blog\u002Foge\u002Ftask13",{"title":141,"path":142,"stem":143},"ОГЭ Задание 14","\u002Fblog\u002Foge\u002Ftask14","blog\u002Foge\u002Ftask14",{"title":145,"path":146,"stem":147},"ОГЭ Задание 15","\u002Fblog\u002Foge\u002Ftask15","blog\u002Foge\u002Ftask15",{"title":149,"path":150,"stem":151},"ОГЭ Задание 16","\u002Fblog\u002Foge\u002Ftask16","blog\u002Foge\u002Ftask16",{"title":153,"path":154,"stem":155},"ОГЭ Задание 2","\u002Fblog\u002Foge\u002Ftask2","blog\u002Foge\u002Ftask2",{"title":157,"path":158,"stem":159},"ОГЭ Задание 3","\u002Fblog\u002Foge\u002Ftask3","blog\u002Foge\u002Ftask3",{"title":161,"path":162,"stem":163},"ОГЭ Задание 4","\u002Fblog\u002Foge\u002Ftask4","blog\u002Foge\u002Ftask4",{"title":165,"path":166,"stem":167},"ОГЭ Задание 5","\u002Fblog\u002Foge\u002Ftask5","blog\u002Foge\u002Ftask5",{"title":169,"path":170,"stem":171},"ОГЭ Задание 6","\u002Fblog\u002Foge\u002Ftask6","blog\u002Foge\u002Ftask6",{"title":173,"path":174,"stem":175},"ОГЭ Задание 7","\u002Fblog\u002Foge\u002Ftask7","blog\u002Foge\u002Ftask7",{"title":177,"path":178,"stem":179},"ОГЭ Задание 8","\u002Fblog\u002Foge\u002Ftask8","blog\u002Foge\u002Ftask8",{"title":181,"path":182,"stem":183},"ОГЭ Задание 9","\u002Fblog\u002Foge\u002Ftask9","blog\u002Foge\u002Ftask9",{"title":185,"path":186,"stem":187,"children":188,"page":114},"Python","\u002Fblog\u002Fpython","blog\u002Fpython",[189,193,197,201,205,209,213,217,221,225,229,233,237,241,245,249,253,257,261,265,269,273,277,281,285,289,293,297,301,305,309,313,317,321,325],{"title":190,"path":191,"stem":192},"Знакомство с синтаксисом","\u002Fblog\u002Fpython\u002Fst1","blog\u002Fpython\u002Fst1",{"title":194,"path":195,"stem":196},"Отладка","\u002Fblog\u002Fpython\u002Fst10","blog\u002Fpython\u002Fst10",{"title":198,"path":199,"stem":200},"Модули и пакеты","\u002Fblog\u002Fpython\u002Fst11","blog\u002Fpython\u002Fst11",{"title":202,"path":203,"stem":204},"Кортежи","\u002Fblog\u002Fpython\u002Fst12","blog\u002Fpython\u002Fst12",{"title":206,"path":207,"stem":208},"Знакомство со списками","\u002Fblog\u002Fpython\u002Fst13","blog\u002Fpython\u002Fst13",{"title":210,"path":211,"stem":212},"Списки и циклы","\u002Fblog\u002Fpython\u002Fst14","blog\u002Fpython\u002Fst14",{"title":214,"path":215,"stem":216},"Использование списков ч.1","\u002Fblog\u002Fpython\u002Fst15","blog\u002Fpython\u002Fst15",{"title":218,"path":219,"stem":220},"Использование списков ч.2","\u002Fblog\u002Fpython\u002Fst16","blog\u002Fpython\u002Fst16",{"title":222,"path":223,"stem":224},"Использование списков ч.3","\u002Fblog\u002Fpython\u002Fst17","blog\u002Fpython\u002Fst17",{"title":226,"path":227,"stem":228},"Словари","\u002Fblog\u002Fpython\u002Fst18","blog\u002Fpython\u002Fst18",{"title":230,"path":231,"stem":232},"Множества","\u002Fblog\u002Fpython\u002Fst19","blog\u002Fpython\u002Fst19",{"title":234,"path":235,"stem":236},"Переменные","\u002Fblog\u002Fpython\u002Fst2","blog\u002Fpython\u002Fst2",{"title":238,"path":239,"stem":240},"Хеш-таблицы","\u002Fblog\u002Fpython\u002Fst20","blog\u002Fpython\u002Fst20",{"title":242,"path":243,"stem":244},"Решето Эратосфена","\u002Fblog\u002Fpython\u002Fst21","blog\u002Fpython\u002Fst21",{"title":246,"path":247,"stem":248},"Длинная арифметика","\u002Fblog\u002Fpython\u002Fst22","blog\u002Fpython\u002Fst22",{"title":250,"path":251,"stem":252},"Декораторы функций","\u002Fblog\u002Fpython\u002Fst23","blog\u002Fpython\u002Fst23",{"title":254,"path":255,"stem":256},"Знакомство с алгоритмами","\u002Fblog\u002Fpython\u002Fst24","blog\u002Fpython\u002Fst24",{"title":258,"path":259,"stem":260},"Бинарный поиск – примеры задач","\u002Fblog\u002Fpython\u002Fst25","blog\u002Fpython\u002Fst25",{"title":262,"path":263,"stem":264},"Сортировка выбором","\u002Fblog\u002Fpython\u002Fst26","blog\u002Fpython\u002Fst26",{"title":266,"path":267,"stem":268},"Рекурсия и стек","\u002Fblog\u002Fpython\u002Fst27","blog\u002Fpython\u002Fst27",{"title":270,"path":271,"stem":272},"Быстрая сортировка","\u002Fblog\u002Fpython\u002Fst28","blog\u002Fpython\u002Fst28",{"title":274,"path":275,"stem":276},"Поиск в ширину","\u002Fblog\u002Fpython\u002Fst29","blog\u002Fpython\u002Fst29",{"title":278,"path":279,"stem":280},"Работа со строками","\u002Fblog\u002Fpython\u002Fst3","blog\u002Fpython\u002Fst3",{"title":282,"path":283,"stem":284},"Поиск в глубину","\u002Fblog\u002Fpython\u002Fst30","blog\u002Fpython\u002Fst30",{"title":286,"path":287,"stem":288},"Сбалансированные деревья","\u002Fblog\u002Fpython\u002Fst31","blog\u002Fpython\u002Fst31",{"title":290,"path":291,"stem":292},"Алгоритм Дейкстры","\u002Fblog\u002Fpython\u002Fst32","blog\u002Fpython\u002Fst32",{"title":294,"path":295,"stem":296},"Жадные алгоритмы","\u002Fblog\u002Fpython\u002Fst33","blog\u002Fpython\u002Fst33",{"title":298,"path":299,"stem":300},"Динамическое программирование","\u002Fblog\u002Fpython\u002Fst34","blog\u002Fpython\u002Fst34",{"title":302,"path":303,"stem":304},"Алгоритм k ближайших соседей","\u002Fblog\u002Fpython\u002Fst35","blog\u002Fpython\u002Fst35",{"title":306,"path":307,"stem":308},"Типы данных","\u002Fblog\u002Fpython\u002Fst4","blog\u002Fpython\u002Fst4",{"title":310,"path":311,"stem":312},"О функциях","\u002Fblog\u002Fpython\u002Fst5","blog\u002Fpython\u002Fst5",{"title":314,"path":315,"stem":316},"Свойства и методы","\u002Fblog\u002Fpython\u002Fst6","blog\u002Fpython\u002Fst6",{"title":318,"path":319,"stem":320},"Определение функций","\u002Fblog\u002Fpython\u002Fst7","blog\u002Fpython\u002Fst7",{"title":322,"path":323,"stem":324},"Логика","\u002Fblog\u002Fpython\u002Fst8","blog\u002Fpython\u002Fst8",{"title":326,"path":327,"stem":328},"Циклы","\u002Fblog\u002Fpython\u002Fst9","blog\u002Fpython\u002Fst9",{"title":330,"path":331,"stem":332,"children":333,"page":114},"Toi","\u002Fblog\u002Ftoi","blog\u002Ftoi",[334,338,342,346,350,354,358,362,366,370,374,378,382],{"title":335,"path":336,"stem":337},"Информация и информационные процессы","\u002Fblog\u002Ftoi\u002Fst1","blog\u002Ftoi\u002Fst1",{"title":339,"path":340,"stem":341},"Электронные таблицы","\u002Fblog\u002Ftoi\u002Fst10","blog\u002Ftoi\u002Fst10",{"title":343,"path":344,"stem":345},"Система, её свойства и компоненты. Моделирование","\u002Fblog\u002Ftoi\u002Fst11","blog\u002Ftoi\u002Fst11",{"title":347,"path":348,"stem":349},"Представление информации в компьютере","\u002Fblog\u002Ftoi\u002Fst12","blog\u002Ftoi\u002Fst12",{"title":351,"path":352,"stem":353},"Средства информационно-коммуникационных технологий. Файловая система","\u002Fblog\u002Ftoi\u002Fst13","blog\u002Ftoi\u002Fst13",{"title":355,"path":356,"stem":357},"Комбинаторика","\u002Fblog\u002Ftoi\u002Fst2","blog\u002Ftoi\u002Fst2",{"title":359,"path":360,"stem":361},"Адресация в интернете","\u002Fblog\u002Ftoi\u002Fst3","blog\u002Ftoi\u002Fst3",{"title":363,"path":364,"stem":365},"Измерение количества информации","\u002Fblog\u002Ftoi\u002Fst4","blog\u002Ftoi\u002Fst4",{"title":367,"path":368,"stem":369},"Системы счисления","\u002Fblog\u002Ftoi\u002Fst5","blog\u002Ftoi\u002Fst5",{"title":371,"path":372,"stem":373},"Диаграммы Эйлера — Венна","\u002Fblog\u002Ftoi\u002Fst6","blog\u002Ftoi\u002Fst6",{"title":375,"path":376,"stem":377},"Условие Фано","\u002Fblog\u002Ftoi\u002Fst7","blog\u002Ftoi\u002Fst7",{"title":379,"path":380,"stem":381},"Теория графов","\u002Fblog\u002Ftoi\u002Fst8","blog\u002Ftoi\u002Fst8",{"title":383,"path":384,"stem":385},"Алгебра логики","\u002Fblog\u002Ftoi\u002Fst9","blog\u002Ftoi\u002Fst9",{"id":387,"title":270,"author":388,"body":393,"date":2271,"description":2272,"extension":2273,"image":2274,"meta":2275,"minRead":2276,"navigation":750,"num":2276,"path":271,"seo":2277,"stem":272,"__hash__":2278},"python\u002Fblog\u002Fpython\u002Fst28.md",{"name":389,"avatar":390},"Штана Альберт Игоревич",{"src":391,"alt":392},"me.jpg","@ashtana",{"type":394,"value":395,"toc":2257},"minimark",[396,400,405,413,425,430,433,440,450,453,459,462,465,573,585,590,599,646,656,664,667,674,684,687,873,876,879,916,919,946,958,965,971,986,989,1000,1018,1045,1048,1060,1063,1252,1257,1260,1266,1269,1584,1602,1606,1609,1644,1703,1757,1863,1876,1881,1884,1910,1913,1926,1929,2217,2220,2231,2234,2236,2243,2246,2250,2254],[397,398,270],"h2",{"id":399},"быстрая-сортировка",[401,402],"card-collapsible",{":isList":403,"title":404},"[\"Сначала идёт описание стратегии \\\"разделяй и властвуй\\\". Случается так, задача, над которой вы трудитесь, не решается ни одним из известных вам алгоритмов. Столкнувшись с такой задачей необходимо будет разделить её на подзадачи. \\\"Разделяй и властвуй — первая общая стратегия для разделения задачи на подзадачи.\\\"\",\"Далее рассматривается алгоритм быстрой сортировки – элегантный алгоритм сортировки, часто применяемый на практике. Алгоритм быстрой сортировки использует стратегию \\\"Разделяй и властвуй\\\".\"]","Из этой статьи вы узнаете",[406,407,408,409],"p",{},"В этой статье сначала исследуем принцип или стратегию \"Разделяй и властвуй\" – это хорошо известный рекурсивный метод решения задач.\n",[410,411,412],"a",{"href":267},"О рекурсии в прошлой статье можно прочитать здесь.",[406,414,415,416,420,421,424],{},"Сам алгоритм не особенно полезен если он решает только задачу одного типа. Стратегия \"Разделяй и властвуй\" помогает выработать новый подход к решению задач.\nСначала стоить понять в чём заключается эта стратегия и такой подход и концу статьи рассмотрим алгоритм ",[417,418,419],"em",{},"быстрой сортировки.","\nЭтот алгоритм работает намного быстрее сортировки выбором(",[410,422,423],{"href":263},"о сортировке выбором в этой статье",").\nТакже алгоритм быстрой сортировки является хорошим примером элегантного способа решения задачи и написании элегантного кода.",[426,427,429],"h3",{"id":428},"стратегия-разделяй-и-властвуй","Стратегия \"Разделяй и властвуй\"",[406,431,432],{},"Для начала рассмотрим три примера. Сначала разберём наглядный пример. Потом разберём пример кода, который выглядит не изящно, но, пожалуй воспринимается проще. И в третьем примере уже рассмотрим алгоритм быстрой сортировки, использующий стратегию \"разделяй и властвуй\".",[406,434,435,436,439],{},"Представьте, что вы владеете земельным участком размером 1680 метров на 640 метров.\nВы хотели бы разделить землю на одинаковые ",[417,437,438],{},"квадратные"," участки. Участки должны быть настолько большими, насколько это возможно.\nКак определить наибольший размер квадратного участка? Воспользоваться стратегией \"разделяй и властвуй\"! Решение задачи будет состоять из двух шагов:",[441,442,443,447],"ol",{},[444,445,446],"li",{},"Определить базовый случай. Это должен быть простейший случай из всех возможных.",[444,448,449],{},"Задача делиться или сокращается до тех пор, пока не будет сведена к базовому случаю.",[406,451,452],{},"А теперь воспользуемся стратегией \"разделяй и властвуй\" для решения задачи. Каков самый большой размер квадрата который может получиться?\nДля начала нужно определить базовый случай. Самая простая ситуация это если длина одной стороны кратна длине другой стороны.\nПредположим, длина одной стороны составляет 25м, а длина другой 50м. В этом случае размер самого большого участка составит 25м x 25м, и надел после деления будет состоять из двух таких участков.\nТеперь нужно вычислить рекурсивный случай. В соответствии со стратегией при каждом рекурсивном случае задача должна сокращаться. Как сократить эту задачу?\nДля начала разместим самые большие участки, которые можно использовать. По длине получится расположить два квадратных участка 640x640 метров и останется не распределённой земля в 400 метров.\nТут и наступает что называется \"момент истинны\". Нераспределённый остаток – это тоже надел земли, который нужно распределить. К нему можно также применить такой же алгоритм.\nПолучается что нужно разделить теперь оставшийся меньший участок размером 640 x 400 метров. Если будет найден этот самый большой участок для остатка, то мы найдем решение для всего размера земли.",[454,455,456],"blockquote",{},[406,457,458],{},"\"Если будет найден этот самый большой участок для остатка, то мы найдем решение для всего размера земли. В доказательство поищите алгоритм Евклида.\"",[406,460,461],{},"Если дальше делить участок размером 640 на 400 метров, то размеры самого большого квадрата, который можно создать, составляют 400x400 метров.\nОстанется после этого ещё меньший нераспределённый участок размером 400x240 метров.\nОтсекая поделенную часть, мы приходим к ещё меньшему размеру сегмента, 240x160 метров. После очередного \"отсечения\" получается ещё меньший сегмент земли.\nИ наконец, мы придём к базовому случаю: 160 на 80. Если разбить этот сегмент на два квадрата 80 на 80, то ничего лишнего уже не останется!\nИтак, для исходного размера земли (1680 метров на 640 метров) самый большой размер участка будет равен 80 на 80 метров.",[406,463,464],{},"Рассмотрим ещё один пример. Имеется массив чисел: 3, 4, 6. Нужно написать код, чтобы просуммировать все числа и вернуть сумму. Сделать это можно с помощью функции например так:",[466,467,472],"pre",{"className":468,"code":469,"language":470,"meta":471,"style":471},"language-python shiki shiki-themes github-light","def summ(arr):\n  total = 0\n  for x in arr:\n    total += x\n  return total\n \nprint(summ([3, 4, 6]))\n","python","",[473,474,475,492,505,520,532,541,547],"code",{"__ignoreMap":471},[476,477,480,484,488],"span",{"class":478,"line":479},"line",1,[476,481,483],{"class":482},"sD7c4","def",[476,485,487],{"class":486},"s7eDp"," summ",[476,489,491],{"class":490},"sgsFI","(arr):\n",[476,493,495,498,501],{"class":478,"line":494},2,[476,496,497],{"class":490},"  total ",[476,499,500],{"class":482},"=",[476,502,504],{"class":503},"sYu0t"," 0\n",[476,506,508,511,514,517],{"class":478,"line":507},3,[476,509,510],{"class":482},"  for",[476,512,513],{"class":490}," x ",[476,515,516],{"class":482},"in",[476,518,519],{"class":490}," arr:\n",[476,521,523,526,529],{"class":478,"line":522},4,[476,524,525],{"class":490},"    total ",[476,527,528],{"class":482},"+=",[476,530,531],{"class":490}," x\n",[476,533,535,538],{"class":478,"line":534},5,[476,536,537],{"class":482},"  return",[476,539,540],{"class":490}," total\n",[476,542,544],{"class":478,"line":543},6,[476,545,546],{"class":490}," \n",[476,548,550,553,556,559,562,565,567,570],{"class":478,"line":549},7,[476,551,552],{"class":503},"print",[476,554,555],{"class":490},"(summ([",[476,557,558],{"class":503},"3",[476,560,561],{"class":490},", ",[476,563,564],{"class":503},"4",[476,566,561],{"class":490},[476,568,569],{"class":503},"6",[476,571,572],{"class":490},"]))\n",[406,574,575,576,580,581,584],{},"А как сделать то же самое, но уже с помощью рекурсивной функции?\n",[577,578,579],"strong",{},"Пункт 1:"," ",[417,582,583],{},"определить базовый случай."," Как выглядит самый простой массив, который можно получить? Если будет массив с 0 или 1 элементом, то сумму достаточно просто получить.",[454,586,587],{},[406,588,589],{},"Если нужно написать рекурсивную функцию в которой будет задействован массив, то базовым случаем очень часто будет пустой массив или массив из одного элемента.",[406,591,592,580,595,598],{},[577,593,594],{},"Пункт 2:",[417,596,597],{},"каждый рекурсивный вызов должен приближать вас к пустому массиву."," Как уменьшить размер задачи? Один из возможных способов:",[466,600,602],{"className":468,"code":601,"language":470,"meta":471,"style":471},"summ([3, 4, 6]) # => 13\n3 + summ([4, 6]) # => 13\n",[473,603,604,626],{"__ignoreMap":471},[476,605,606,609,611,613,615,617,619,622],{"class":478,"line":479},[476,607,608],{"class":490},"summ([",[476,610,558],{"class":503},[476,612,561],{"class":490},[476,614,564],{"class":503},[476,616,561],{"class":490},[476,618,569],{"class":503},[476,620,621],{"class":490},"]) ",[476,623,625],{"class":624},"sAwPA","# => 13\n",[476,627,628,630,633,636,638,640,642,644],{"class":478,"line":494},[476,629,558],{"class":503},[476,631,632],{"class":482}," +",[476,634,635],{"class":490}," summ([",[476,637,564],{"class":503},[476,639,561],{"class":490},[476,641,569],{"class":503},[476,643,621],{"class":490},[476,645,625],{"class":624},[406,647,648,649,652,653,655],{},"Во втором случае функции ",[473,650,651],{},"summ"," передаётся меньший массив, а результат остаётся такой же. А это означает что мы таким образом сократили размер задачи!\nФункция ",[473,654,651],{}," может работать по следующему правилу или схеме:",[441,657,658,661],{},[444,659,660],{},"Функция получает список",[444,662,663],{},"Если список пуст, вернуть 0. А иначе результат должен быть равен сумме первого элемента массива и суммы остальных элементов массива.",[406,665,666],{},"Вот как это выглядит(не забывайте, что при рекурсии сохраняется состояние переменных):",[406,668,669],{},[670,671],"img",{"alt":672,"src":673},"Пример с массивом","\u002Fimages\u002Fblog\u002Fpython\u002Fst28\u002Fimg1.png",[454,675,676],{},[406,677,678,679],{},"Немного о функциональном программировании. Зачем применять рекурсию, если задачу можно легко решить циклом? Дело в том, что например в языках функционального программирования(Haskell, Lisp, Erlang, APL) циклов не существует, поэтому для написания подобных задач приходится применять рекурсию. Если вы хорошо поймёте рекурсию, вам будет проще работать с функциональными языками программирования. ",[417,680,681],{},[577,682,683],{},"Если вам нравится рекурсия присмотритесь к таким языкам как Haskell, R, F#, Clojure, Scala, Erlang.",[406,685,686],{},"Вот ещё код для пары примеров похожих задач:",[466,688,690],{"className":468,"code":689,"language":470,"meta":471,"style":471},"# Рекурсивная функция для подсчёта элементов в списке\ndef count(m_list):\n  if m_list == []:\n    return 0\n  return 1 + count(list[1:]) \n\n# Рекурсивная функция для нахождения наибольшего числа в списке\ndef maxx(m_list):\n  if len(m_list) == 2:\n    return m_list[0] if m_list[0] > m_list[1] else m_list[1]\n  s_max = maxx(m_list[1:])\n  return m_list[0] if m_list[0] > s_max else s_max\n",[473,691,692,697,707,721,728,746,752,757,767,786,828,844],{"__ignoreMap":471},[476,693,694],{"class":478,"line":479},[476,695,696],{"class":624},"# Рекурсивная функция для подсчёта элементов в списке\n",[476,698,699,701,704],{"class":478,"line":494},[476,700,483],{"class":482},[476,702,703],{"class":486}," count",[476,705,706],{"class":490},"(m_list):\n",[476,708,709,712,715,718],{"class":478,"line":507},[476,710,711],{"class":482},"  if",[476,713,714],{"class":490}," m_list ",[476,716,717],{"class":482},"==",[476,719,720],{"class":490}," []:\n",[476,722,723,726],{"class":478,"line":522},[476,724,725],{"class":482},"    return",[476,727,504],{"class":503},[476,729,730,732,735,737,740,743],{"class":478,"line":534},[476,731,537],{"class":482},[476,733,734],{"class":503}," 1",[476,736,632],{"class":482},[476,738,739],{"class":490}," count(list[",[476,741,742],{"class":503},"1",[476,744,745],{"class":490},":]) \n",[476,747,748],{"class":478,"line":543},[476,749,751],{"emptyLinePlaceholder":750},true,"\n",[476,753,754],{"class":478,"line":549},[476,755,756],{"class":624},"# Рекурсивная функция для нахождения наибольшего числа в списке\n",[476,758,760,762,765],{"class":478,"line":759},8,[476,761,483],{"class":482},[476,763,764],{"class":486}," maxx",[476,766,706],{"class":490},[476,768,770,772,775,778,780,783],{"class":478,"line":769},9,[476,771,711],{"class":482},[476,773,774],{"class":503}," len",[476,776,777],{"class":490},"(m_list) ",[476,779,717],{"class":482},[476,781,782],{"class":503}," 2",[476,784,785],{"class":490},":\n",[476,787,789,791,794,797,800,803,805,807,809,812,814,816,818,821,823,825],{"class":478,"line":788},10,[476,790,725],{"class":482},[476,792,793],{"class":490}," m_list[",[476,795,796],{"class":503},"0",[476,798,799],{"class":490},"] ",[476,801,802],{"class":482},"if",[476,804,793],{"class":490},[476,806,796],{"class":503},[476,808,799],{"class":490},[476,810,811],{"class":482},">",[476,813,793],{"class":490},[476,815,742],{"class":503},[476,817,799],{"class":490},[476,819,820],{"class":482},"else",[476,822,793],{"class":490},[476,824,742],{"class":503},[476,826,827],{"class":490},"]\n",[476,829,831,834,836,839,841],{"class":478,"line":830},11,[476,832,833],{"class":490},"  s_max ",[476,835,500],{"class":482},[476,837,838],{"class":490}," maxx(m_list[",[476,840,742],{"class":503},[476,842,843],{"class":490},":])\n",[476,845,847,849,851,853,855,857,859,861,863,865,868,870],{"class":478,"line":846},12,[476,848,537],{"class":482},[476,850,793],{"class":490},[476,852,796],{"class":503},[476,854,799],{"class":490},[476,856,802],{"class":482},[476,858,793],{"class":490},[476,860,796],{"class":503},[476,862,799],{"class":490},[476,864,811],{"class":482},[476,866,867],{"class":490}," s_max ",[476,869,820],{"class":482},[476,871,872],{"class":490}," s_max\n",[426,874,270],{"id":875},"быстрая-сортировка-1",[406,877,878],{},"Быстрая сортировка относится к алгоритмам сортировки и она работает намного быстрее сортировки выбором и часто применяется в реальных прогрпаммах.\nБыстрая сортировка основана на стратегии \"разделяй и властвуй\".\nВоспользуемся быстрой сортировкой для упорядочения массива. Как выглядит самый простой массив, с которым может справиться алгоритм сортировки?\nНекоторые массивы вообще не нуждаются в сортировке, например: пустой или с одним элементом – они базовый случай.\nМассивы с одним элементом или пустые нужно сразу возвращать:",[466,880,882],{"className":468,"code":881,"language":470,"meta":471,"style":471},"def quicksort(arr):\n  if len(arr) \u003C 2:\n    return arr\n",[473,883,884,893,909],{"__ignoreMap":471},[476,885,886,888,891],{"class":478,"line":479},[476,887,483],{"class":482},[476,889,890],{"class":486}," quicksort",[476,892,491],{"class":490},[476,894,895,897,899,902,905,907],{"class":478,"line":494},[476,896,711],{"class":482},[476,898,774],{"class":503},[476,900,901],{"class":490},"(arr) ",[476,903,904],{"class":482},"\u003C",[476,906,782],{"class":503},[476,908,785],{"class":490},[476,910,911,913],{"class":478,"line":507},[476,912,725],{"class":482},[476,914,915],{"class":490}," arr\n",[406,917,918],{},"Рассмотрим далее массивы большего размера. Массив из двух элементов тоже сортируется без особых проблем. Сравнить нужно только два элемента – если первый меньше второго, значит меняем их местами.\nА если массив состоит из трёх элементов? То массив уже должен разделяться до тех пор, пока мы не придём к базовому случаю.",[406,920,921,922,925,926,929,930,933,934,937,938,941,942,945],{},"Алгоритм быстрой сортировки работает так: сначала в массиве выбирается элемент, который называется ",[417,923,924],{},"опорным",".\nО том как выбирается опорный элемент будет написано далее. Пока предположим, что опорным становится ",[473,927,928],{},"30"," как первый элемент массива: ",[473,931,932],{},"[30, 15, 10]",".\nТеперь нужно найти элементы меньше опорного и больше опорного. Числа меньше опорного это ",[473,935,936],{},"[15, 10]",", а больше опорного это пустой массив ",[473,939,940],{},"[]",".\nЭтот процесс называется ",[417,943,944],{},"разделением."," Теперь у нас есть:",[947,948,949,952,955],"ul",{},[444,950,951],{},"подмассив всех элементов, меньших опорного;",[444,953,954],{},"опорный элемент;",[444,956,957],{},"подмассив всех элементов, больших опорного.",[406,959,960,961,964],{},"Два подмассива не отсортированы – они просто выделены из исходного массива. Но если бы они были отсортированы, то провести сортировку всего массива было бы несложно.\nЕсли подмассивы отсортированы, то их можно просто объединить в порядке: левый подмассивы – опорный элемент – правый подмассив.\nВ примере получилось бы так: ",[473,962,963],{},"[10, 15] + [30] + [] = [10, 15, 30]",", таким образом получился бы отсортированный массив.",[406,966,967,968],{},"Как отсортировать подмассивы?\nНужно применить алгоритм сортировки с базовым и рекурсивным случаем к двум подмассивам, а как только наступит базовый случай – объединить результаты вычислений, получив итоговый отсортированный массив!\nЭто выглядит для примера выше так: ",[473,969,970],{},"quicksort([15, 10]) + [30] + quicksort([])  # => [10, 15, 30].",[406,972,973,974,977,978,981,982,985],{},"Также допустим, что изначально был выбран в качестве опорного элемента – элемент ",[473,975,976],{},"15",".\nПри сравнении получаются два подмассива, которые состоят из одного элемента ",[473,979,980],{},"[10]"," и ",[473,983,984],{},"[30]",", а дальше всё то же самое, чтобы их объединить в один итоговый отсортированный массив.",[406,987,988],{},"Алгоритм для сортировки массива из трёх элементов следующий:",[441,990,991,994,997],{},[444,992,993],{},"Выбрать опорный элемент",[444,995,996],{},"Разделить массив на два подмассива: элементы, меньше опорного, и элементы, больше опорного.",[444,998,999],{},"Рекурсивно применить быструю сортировку к двум подмассивам.",[406,1001,1002,1003,1006,1007,1009,1010,1013,1014,1017],{},"Рассмотрим массив из четырёх элементов? Пусть будет массив: ",[473,1004,1005],{},"[30, 10, 15, 5]",".\nПредположим, что опорным элементом снова выбрали ",[473,1008,928],{},". Тогда левый подмассив: ",[473,1011,1012],{},"[10, 15, 5]",".\nДалее вы уже узнали как сортируется массив из трёх элементов(рекурсивно применить к нему снова быструю сортировку).\nСоответственно вы можете отсортировать массив из четырёх элементов и так далее, например из пяти элементов. Почему?\nДопустим имеется массив из 5 элементов: ",[473,1015,1016],{},"[3, 5, 2, 1, 4]",".\nВот как выглядят варианты разделения этого массива в зависимости от выбранного элемента:",[441,1019,1020,1025,1030,1035,1040],{},[444,1021,1022],{},[473,1023,1024],{},"[] + [1] + [3, 2, 5, 4]",[444,1026,1027],{},[473,1028,1029],{},"[1] + [2] + [3, 5, 4]",[444,1031,1032],{},[473,1033,1034],{},"[2, 1] + [3] + [5, 4]",[444,1036,1037],{},[473,1038,1039],{},"[3, 2, 1] + [4] + [5]",[444,1041,1042],{},[473,1043,1044],{},"[3, 2, 1, 4] + [5] + []",[406,1046,1047],{},"Все эти подмассивы будут содержать от 0 до 4 элементов. И для них выполняется то же самое действие – рекурсивно запускаем алгоритм быстрой сортировки для каждого из подмассивов пока не достигнем базового случая, и наконец просто объединим все подмассивы в один отсортированный массив!\nИтак, решение работает независимо от выбора опорного элемента. Следуя такой же логике, вы можете отсортировать массив из 6 и более элементов по той же схеме и т.д.",[454,1049,1050],{},[406,1051,1052,1053,1059],{},"Выше был описан метод доказательство по индукции. Это способ доказательства, что ваш алгоритм рабочий.\nКаждое индуктивное доказательство состоит из двух частей: базового и индукционного. Подробнее об этом методе вы можете почитать здесь: ",[410,1054,1058],{"href":1055,"rel":1056},"https:\u002F\u002Fru.wikipedia.org\u002Fwiki\u002F%D0%9C%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%B8%D0%BD%D0%B4%D1%83%D0%BA%D1%86%D0%B8%D1%8F",[1057],"nofollow","Математическая индукция.","\nЗдесь я лишь упомяну, что это интересный метод доказательства, который согласуется со стратегией \"разделяй и властвуй\".",[406,1061,1062],{},"Вот как выглядит наш код на Python для быстрой сортировки:",[466,1064,1066],{"className":468,"code":1065,"language":470,"meta":471,"style":471},"def quicksort(arr):\n  if len(arr) \u003C 2:  # базовый случай\n    return arr\n  # Далее рекурсивный случай\n  piv = arr[0]  # опорный элемент\n  less = [i for i in arr[1:] if i \u003C= piv]  # подмассив всех элементов меньше или равных опорному\n  great = [i for i in arr[1:] if i > piv]  # подмассив всех элементов больше опорного\n  return quicksort(less) + [piv] + quicksort(great)  # рекурсивный случай\n\nprint(quicksort([10, 5, 30, 15, 20]))  # => [5, 10, 15, 20, 30]\n",[473,1067,1068,1076,1094,1100,1105,1123,1161,1193,1214,1218],{"__ignoreMap":471},[476,1069,1070,1072,1074],{"class":478,"line":479},[476,1071,483],{"class":482},[476,1073,890],{"class":486},[476,1075,491],{"class":490},[476,1077,1078,1080,1082,1084,1086,1088,1091],{"class":478,"line":494},[476,1079,711],{"class":482},[476,1081,774],{"class":503},[476,1083,901],{"class":490},[476,1085,904],{"class":482},[476,1087,782],{"class":503},[476,1089,1090],{"class":490},":  ",[476,1092,1093],{"class":624},"# базовый случай\n",[476,1095,1096,1098],{"class":478,"line":507},[476,1097,725],{"class":482},[476,1099,915],{"class":490},[476,1101,1102],{"class":478,"line":522},[476,1103,1104],{"class":624},"  # Далее рекурсивный случай\n",[476,1106,1107,1110,1112,1115,1117,1120],{"class":478,"line":534},[476,1108,1109],{"class":490},"  piv ",[476,1111,500],{"class":482},[476,1113,1114],{"class":490}," arr[",[476,1116,796],{"class":503},[476,1118,1119],{"class":490},"]  ",[476,1121,1122],{"class":624},"# опорный элемент\n",[476,1124,1125,1128,1130,1133,1136,1139,1141,1143,1145,1148,1150,1152,1155,1158],{"class":478,"line":543},[476,1126,1127],{"class":490},"  less ",[476,1129,500],{"class":482},[476,1131,1132],{"class":490}," [i ",[476,1134,1135],{"class":482},"for",[476,1137,1138],{"class":490}," i ",[476,1140,516],{"class":482},[476,1142,1114],{"class":490},[476,1144,742],{"class":503},[476,1146,1147],{"class":490},":] ",[476,1149,802],{"class":482},[476,1151,1138],{"class":490},[476,1153,1154],{"class":482},"\u003C=",[476,1156,1157],{"class":490}," piv]  ",[476,1159,1160],{"class":624},"# подмассив всех элементов меньше или равных опорному\n",[476,1162,1163,1166,1168,1170,1172,1174,1176,1178,1180,1182,1184,1186,1188,1190],{"class":478,"line":549},[476,1164,1165],{"class":490},"  great ",[476,1167,500],{"class":482},[476,1169,1132],{"class":490},[476,1171,1135],{"class":482},[476,1173,1138],{"class":490},[476,1175,516],{"class":482},[476,1177,1114],{"class":490},[476,1179,742],{"class":503},[476,1181,1147],{"class":490},[476,1183,802],{"class":482},[476,1185,1138],{"class":490},[476,1187,811],{"class":482},[476,1189,1157],{"class":490},[476,1191,1192],{"class":624},"# подмассив всех элементов больше опорного\n",[476,1194,1195,1197,1200,1203,1206,1208,1211],{"class":478,"line":759},[476,1196,537],{"class":482},[476,1198,1199],{"class":490}," quicksort(less) ",[476,1201,1202],{"class":482},"+",[476,1204,1205],{"class":490}," [piv] ",[476,1207,1202],{"class":482},[476,1209,1210],{"class":490}," quicksort(great)  ",[476,1212,1213],{"class":624},"# рекурсивный случай\n",[476,1215,1216],{"class":478,"line":769},[476,1217,751],{"emptyLinePlaceholder":750},[476,1219,1220,1222,1225,1228,1230,1233,1235,1237,1239,1241,1243,1246,1249],{"class":478,"line":788},[476,1221,552],{"class":503},[476,1223,1224],{"class":490},"(quicksort([",[476,1226,1227],{"class":503},"10",[476,1229,561],{"class":490},[476,1231,1232],{"class":503},"5",[476,1234,561],{"class":490},[476,1236,928],{"class":503},[476,1238,561],{"class":490},[476,1240,976],{"class":503},[476,1242,561],{"class":490},[476,1244,1245],{"class":503},"20",[476,1247,1248],{"class":490},"]))  ",[476,1250,1251],{"class":624},"# => [5, 10, 15, 20, 30]\n",[1253,1254,1256],"h4",{"id":1255},"о-большое","\"О-большое\"",[406,1258,1259],{},"Алгоритм быстрой сортировки уникален тем, что скорость его зависит от выбора опорного элемента.\nВспомним наиболее типовые варианты времени выполнения алгоритмов по концепции \"О-большое\":",[406,1261,1262],{},[670,1263],{"alt":1264,"src":1265},"Примеры О-большого","\u002Fimages\u002Fblog\u002Fpython\u002Fst28\u002Fimg2.png",[406,1267,1268],{},"На изображении выше приведены примерные оценки времени выполнения при 10 операциях в секунду. Они не точны, а всего лишь дают представление о том, насколько различается время выполнением того или иного алгоритма.\nНа практике современный ПК конечно способен выполнять гораздо больше чем 10 операций в секунду.",[406,1270,1271,1272,1275,1276,1376,1377,1380,1381,1486,1487,1489,1490,1493,1494,1275,1496,1583],{},"Для каждого времени выполнения приведён также пример алгоритма.\nВ \"худшем\" случае ",[417,1273,1274],{},"быстрая сортировка"," выполняется за время: ",[1277,1278,1282],"mjx-container",{"className":1279,"jax":1281},[1280],"MathJax","SVG",[1283,1284,1292,1320],"svg",{"style":1285,"xmlns":1286,"width":1287,"height":1288,"role":670,"focusable":1289,"viewBox":1290,"xmlnsXLink":1291},"vertical-align: -0.566ex;","http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","6.461ex","2.452ex","false","0 -833.9 2855.6 1083.9","http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxlink",[1293,1294,1295,1300,1304,1308,1312,1316],"defs",{},[1296,1297],"path",{"id":1298,"d":1299},"MJX-1-TEX-I-1D442","M740 435Q740 320 676 213T511 42T304 -22Q207 -22 138 35T51 201Q50 209 50 244Q50 346 98 438T227 601Q351 704 476 704Q514 704 524 703Q621 689 680 617T740 435ZM637 476Q637 565 591 615T476 665Q396 665 322 605Q242 542 200 428T157 216Q157 126 200 73T314 19Q404 19 485 98T608 313Q637 408 637 476Z",[1296,1301],{"id":1302,"d":1303},"MJX-1-TEX-N-28","M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z",[1296,1305],{"id":1306,"d":1307},"MJX-1-TEX-I-1D45B","M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z",[1296,1309],{"id":1310,"d":1311},"MJX-1-TEX-N-32","M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z",[1296,1313],{"id":1314,"d":1315},"MJX-1-TEX-N-29","M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z",[1296,1317],{"id":1318,"d":1319},"MJX-1-TEX-N-2E","M78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60Z",[1321,1322,1325],"g",{"stroke":1323,"fill":1323,"stroke-width":796,"transform":1324},"currentColor","scale(1,-1)",[1321,1326,1328,1336,1344,1362,1369],{"dataMmlNode":1327},"math",[1321,1329,1331],{"dataMmlNode":1330},"mi",[1332,1333],"use",{"dataC":1334,"xLinkHref":1335},"1D442","#MJX-1-TEX-I-1D442",[1321,1337,1340],{"dataMmlNode":1338,"transform":1339},"mo","translate(763,0)",[1332,1341],{"dataC":1342,"xLinkHref":1343},"28","#MJX-1-TEX-N-28",[1321,1345,1348,1354],{"dataMmlNode":1346,"transform":1347},"msup","translate(1152,0)",[1321,1349,1350],{"dataMmlNode":1330},[1332,1351],{"dataC":1352,"xLinkHref":1353},"1D45B","#MJX-1-TEX-I-1D45B",[1321,1355,1358],{"dataMmlNode":1356,"transform":1357},"mn","translate(633,363) scale(0.707)",[1332,1359],{"dataC":1360,"xLinkHref":1361},"32","#MJX-1-TEX-N-32",[1321,1363,1365],{"dataMmlNode":1338,"transform":1364},"translate(2188.6,0)",[1332,1366],{"dataC":1367,"xLinkHref":1368},"29","#MJX-1-TEX-N-29",[1321,1370,1372],{"dataMmlNode":1338,"transform":1371},"translate(2577.6,0)",[1332,1373],{"dataC":1374,"xLinkHref":1375},"2E","#MJX-1-TEX-N-2E","\nДругой алгоритм сортировки — ",[417,1378,1379],{},"сортировка слиянием"," работает за время: ",[1277,1382,1384],{"className":1383,"jax":1281},[1280],[1283,1385,1389,1422],{"style":1285,"xmlns":1286,"width":1386,"height":1387,"role":670,"focusable":1289,"viewBox":1388,"xmlnsXLink":1291},"11.818ex","2.262ex","0 -750 5223.4 1000",[1293,1390,1391,1394,1397,1400,1404,1408,1412,1416,1419],{},[1296,1392],{"id":1393,"d":1299},"MJX-2-TEX-I-1D442",[1296,1395],{"id":1396,"d":1303},"MJX-2-TEX-N-28",[1296,1398],{"id":1399,"d":1307},"MJX-2-TEX-I-1D45B",[1296,1401],{"id":1402,"d":1403},"MJX-2-TEX-N-2217","M229 286Q216 420 216 436Q216 454 240 464Q241 464 245 464T251 465Q263 464 273 456T283 436Q283 419 277 356T270 286L328 328Q384 369 389 372T399 375Q412 375 423 365T435 338Q435 325 425 315Q420 312 357 282T289 250L355 219L425 184Q434 175 434 161Q434 146 425 136T401 125Q393 125 383 131T328 171L270 213Q283 79 283 63Q283 53 276 44T250 35Q231 35 224 44T216 63Q216 80 222 143T229 213L171 171Q115 130 110 127Q106 124 100 124Q87 124 76 134T64 161Q64 166 64 169T67 175T72 181T81 188T94 195T113 204T138 215T170 230T210 250L74 315Q65 324 65 338Q65 353 74 363T98 374Q106 374 116 368T171 328L229 286Z",[1296,1405],{"id":1406,"d":1407},"MJX-2-TEX-I-1D459","M117 59Q117 26 142 26Q179 26 205 131Q211 151 215 152Q217 153 225 153H229Q238 153 241 153T246 151T248 144Q247 138 245 128T234 90T214 43T183 6T137 -11Q101 -11 70 11T38 85Q38 97 39 102L104 360Q167 615 167 623Q167 626 166 628T162 632T157 634T149 635T141 636T132 637T122 637Q112 637 109 637T101 638T95 641T94 647Q94 649 96 661Q101 680 107 682T179 688Q194 689 213 690T243 693T254 694Q266 694 266 686Q266 675 193 386T118 83Q118 81 118 75T117 65V59Z",[1296,1409],{"id":1410,"d":1411},"MJX-2-TEX-I-1D45C","M201 -11Q126 -11 80 38T34 156Q34 221 64 279T146 380Q222 441 301 441Q333 441 341 440Q354 437 367 433T402 417T438 387T464 338T476 268Q476 161 390 75T201 -11ZM121 120Q121 70 147 48T206 26Q250 26 289 58T351 142Q360 163 374 216T388 308Q388 352 370 375Q346 405 306 405Q243 405 195 347Q158 303 140 230T121 120Z",[1296,1413],{"id":1414,"d":1415},"MJX-2-TEX-I-1D454","M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z",[1296,1417],{"id":1418,"d":1315},"MJX-2-TEX-N-29",[1296,1420],{"id":1421,"d":1319},"MJX-2-TEX-N-2E",[1321,1423,1424],{"stroke":1323,"fill":1323,"stroke-width":796,"transform":1324},[1321,1425,1426,1431,1436,1441,1448,1455,1462,1469,1474,1480],{"dataMmlNode":1327},[1321,1427,1428],{"dataMmlNode":1330},[1332,1429],{"dataC":1334,"xLinkHref":1430},"#MJX-2-TEX-I-1D442",[1321,1432,1433],{"dataMmlNode":1338,"transform":1339},[1332,1434],{"dataC":1342,"xLinkHref":1435},"#MJX-2-TEX-N-28",[1321,1437,1438],{"dataMmlNode":1330,"transform":1347},[1332,1439],{"dataC":1352,"xLinkHref":1440},"#MJX-2-TEX-I-1D45B",[1321,1442,1444],{"dataMmlNode":1338,"transform":1443},"translate(1974.2,0)",[1332,1445],{"dataC":1446,"xLinkHref":1447},"2217","#MJX-2-TEX-N-2217",[1321,1449,1451],{"dataMmlNode":1330,"transform":1450},"translate(2696.4,0)",[1332,1452],{"dataC":1453,"xLinkHref":1454},"1D459","#MJX-2-TEX-I-1D459",[1321,1456,1458],{"dataMmlNode":1330,"transform":1457},"translate(2994.4,0)",[1332,1459],{"dataC":1460,"xLinkHref":1461},"1D45C","#MJX-2-TEX-I-1D45C",[1321,1463,1465],{"dataMmlNode":1330,"transform":1464},"translate(3479.4,0)",[1332,1466],{"dataC":1467,"xLinkHref":1468},"1D454","#MJX-2-TEX-I-1D454",[1321,1470,1472],{"dataMmlNode":1330,"transform":1471},"translate(3956.4,0)",[1332,1473],{"dataC":1352,"xLinkHref":1440},[1321,1475,1477],{"dataMmlNode":1338,"transform":1476},"translate(4556.4,0)",[1332,1478],{"dataC":1367,"xLinkHref":1479},"#MJX-2-TEX-N-29",[1321,1481,1483],{"dataMmlNode":1338,"transform":1482},"translate(4945.4,0)",[1332,1484],{"dataC":1374,"xLinkHref":1485},"#MJX-2-TEX-N-2E","\nВыходит, что ",[417,1488,1274],{}," ничуть не лучше ",[417,1491,1492],{},"сортировки выбором","! Но это худший случай, а в \"среднем\" случае ",[417,1495,1274],{},[1277,1497,1499],{"className":1498,"jax":1281},[1280],[1283,1500,1501,1530],{"style":1285,"xmlns":1286,"width":1386,"height":1387,"role":670,"focusable":1289,"viewBox":1388,"xmlnsXLink":1291},[1293,1502,1503,1506,1509,1512,1515,1518,1521,1524,1527],{},[1296,1504],{"id":1505,"d":1299},"MJX-3-TEX-I-1D442",[1296,1507],{"id":1508,"d":1303},"MJX-3-TEX-N-28",[1296,1510],{"id":1511,"d":1307},"MJX-3-TEX-I-1D45B",[1296,1513],{"id":1514,"d":1403},"MJX-3-TEX-N-2217",[1296,1516],{"id":1517,"d":1407},"MJX-3-TEX-I-1D459",[1296,1519],{"id":1520,"d":1411},"MJX-3-TEX-I-1D45C",[1296,1522],{"id":1523,"d":1415},"MJX-3-TEX-I-1D454",[1296,1525],{"id":1526,"d":1315},"MJX-3-TEX-N-29",[1296,1528],{"id":1529,"d":1319},"MJX-3-TEX-N-2E",[1321,1531,1532],{"stroke":1323,"fill":1323,"stroke-width":796,"transform":1324},[1321,1533,1534,1539,1544,1549,1554,1559,1564,1569,1573,1578],{"dataMmlNode":1327},[1321,1535,1536],{"dataMmlNode":1330},[1332,1537],{"dataC":1334,"xLinkHref":1538},"#MJX-3-TEX-I-1D442",[1321,1540,1541],{"dataMmlNode":1338,"transform":1339},[1332,1542],{"dataC":1342,"xLinkHref":1543},"#MJX-3-TEX-N-28",[1321,1545,1546],{"dataMmlNode":1330,"transform":1347},[1332,1547],{"dataC":1352,"xLinkHref":1548},"#MJX-3-TEX-I-1D45B",[1321,1550,1551],{"dataMmlNode":1338,"transform":1443},[1332,1552],{"dataC":1446,"xLinkHref":1553},"#MJX-3-TEX-N-2217",[1321,1555,1556],{"dataMmlNode":1330,"transform":1450},[1332,1557],{"dataC":1453,"xLinkHref":1558},"#MJX-3-TEX-I-1D459",[1321,1560,1561],{"dataMmlNode":1330,"transform":1457},[1332,1562],{"dataC":1460,"xLinkHref":1563},"#MJX-3-TEX-I-1D45C",[1321,1565,1566],{"dataMmlNode":1330,"transform":1464},[1332,1567],{"dataC":1467,"xLinkHref":1568},"#MJX-3-TEX-I-1D454",[1321,1570,1571],{"dataMmlNode":1330,"transform":1471},[1332,1572],{"dataC":1352,"xLinkHref":1548},[1321,1574,1575],{"dataMmlNode":1338,"transform":1476},[1332,1576],{"dataC":1367,"xLinkHref":1577},"#MJX-3-TEX-N-29",[1321,1579,1580],{"dataMmlNode":1338,"transform":1482},[1332,1581],{"dataC":1374,"xLinkHref":1582},"#MJX-3-TEX-N-2E","\nВы можете спросить:",[947,1585,1586,1589],{},[444,1587,1588],{},"Что понимать под \"худшим\" и \"средним\" случаем?",[444,1590,1591,1592,1594,1595,1597,1598,1601],{},"Если ",[417,1593,1274],{}," в среднем выполняется за такое же время как и ",[417,1596,1379],{},". То почему бы не использовать ",[417,1599,1600],{},"сортировку слиянием"," всегда? Разве она не быстрее?",[1253,1603,1605],{"id":1604},"сортировка-слиянием","Сортировка слиянием",[406,1607,1608],{},"Напишем простую функцию для вывода каждого элемента в списке:",[466,1610,1612],{"className":468,"code":1611,"language":470,"meta":471,"style":471},"def print_items(myList):\n  for item in myList:\n    print(item)\n",[473,1613,1614,1624,1636],{"__ignoreMap":471},[476,1615,1616,1618,1621],{"class":478,"line":479},[476,1617,483],{"class":482},[476,1619,1620],{"class":486}," print_items",[476,1622,1623],{"class":490},"(myList):\n",[476,1625,1626,1628,1631,1633],{"class":478,"line":494},[476,1627,510],{"class":482},[476,1629,1630],{"class":490}," item ",[476,1632,516],{"class":482},[476,1634,1635],{"class":490}," myList:\n",[476,1637,1638,1641],{"class":478,"line":507},[476,1639,1640],{"class":503},"    print",[476,1642,1643],{"class":490},"(item)\n",[406,1645,1646,1647,1702],{},"Эта функция последовательно переберёт все элементы списка(массива) и выведет их на экран. Так функция перебирает весь список, за время: ",[1277,1648,1650],{"className":1649,"jax":1281},[1280],[1283,1651,1654,1671],{"style":1285,"xmlns":1286,"width":1652,"height":1387,"role":670,"focusable":1289,"viewBox":1653,"xmlnsXLink":1291},"5.473ex","0 -750 2419 1000",[1293,1655,1656,1659,1662,1665,1668],{},[1296,1657],{"id":1658,"d":1299},"MJX-4-TEX-I-1D442",[1296,1660],{"id":1661,"d":1303},"MJX-4-TEX-N-28",[1296,1663],{"id":1664,"d":1307},"MJX-4-TEX-I-1D45B",[1296,1666],{"id":1667,"d":1315},"MJX-4-TEX-N-29",[1296,1669],{"id":1670,"d":1319},"MJX-4-TEX-N-2E",[1321,1672,1673],{"stroke":1323,"fill":1323,"stroke-width":796,"transform":1324},[1321,1674,1675,1680,1685,1690,1696],{"dataMmlNode":1327},[1321,1676,1677],{"dataMmlNode":1330},[1332,1678],{"dataC":1334,"xLinkHref":1679},"#MJX-4-TEX-I-1D442",[1321,1681,1682],{"dataMmlNode":1338,"transform":1339},[1332,1683],{"dataC":1342,"xLinkHref":1684},"#MJX-4-TEX-N-28",[1321,1686,1687],{"dataMmlNode":1330,"transform":1347},[1332,1688],{"dataC":1352,"xLinkHref":1689},"#MJX-4-TEX-I-1D45B",[1321,1691,1693],{"dataMmlNode":1338,"transform":1692},"translate(1752,0)",[1332,1694],{"dataC":1367,"xLinkHref":1695},"#MJX-4-TEX-N-29",[1321,1697,1699],{"dataMmlNode":1338,"transform":1698},"translate(2141,0)",[1332,1700],{"dataC":1374,"xLinkHref":1701},"#MJX-4-TEX-N-2E","\nПредположим далее вы изменили эту функцию и она \"засыпает\" или делает паузу в работе на 1 секунду перед выводом в консоль элемента списка.",[466,1704,1706],{"className":468,"code":1705,"language":470,"meta":471,"style":471},"from time import sleep\ndef print_items_sleep(myList):\n  for item in myList:\n    sleep(1)\n    print(item)\n",[473,1707,1708,1722,1731,1741,1751],{"__ignoreMap":471},[476,1709,1710,1713,1716,1719],{"class":478,"line":479},[476,1711,1712],{"class":482},"from",[476,1714,1715],{"class":490}," time ",[476,1717,1718],{"class":482},"import",[476,1720,1721],{"class":490}," sleep\n",[476,1723,1724,1726,1729],{"class":478,"line":494},[476,1725,483],{"class":482},[476,1727,1728],{"class":486}," print_items_sleep",[476,1730,1623],{"class":490},[476,1732,1733,1735,1737,1739],{"class":478,"line":507},[476,1734,510],{"class":482},[476,1736,1630],{"class":490},[476,1738,516],{"class":482},[476,1740,1635],{"class":490},[476,1742,1743,1746,1748],{"class":478,"line":522},[476,1744,1745],{"class":490},"    sleep(",[476,1747,742],{"class":503},[476,1749,1750],{"class":490},")\n",[476,1752,1753,1755],{"class":478,"line":534},[476,1754,1640],{"class":503},[476,1756,1643],{"class":490},[406,1758,1759,1760,1763,1764,1839,1840,1845,1846,1849,1850,1852,1853,1856,1857,1862],{},"Обе функции проходят по списку один раз, и обе выполняются за время выполнения O(n). Но ",[473,1761,1762],{},"print_items"," работает намного быстрее, потому что она не делает паузу перед выводом каждого элемента.\nСледовательно, при том что обе функции имеют одинаковое \"О-большое\", реально print_items отрабатывает быстрее! Когда вы используете \"О-большое\" это означает следующее(для O(n)):\n",[1277,1765,1767],{"className":1766,"jax":1281},[1280],[1283,1768,1771,1795],{"style":1285,"xmlns":1286,"width":1769,"height":1387,"role":670,"focusable":1289,"viewBox":1770,"xmlnsXLink":1291},"8.589ex","0 -750 3796.4 1000",[1293,1772,1773,1776,1779,1783,1786,1789,1792],{},[1296,1774],{"id":1775,"d":1299},"MJX-5-TEX-I-1D442",[1296,1777],{"id":1778,"d":1303},"MJX-5-TEX-N-28",[1296,1780],{"id":1781,"d":1782},"MJX-5-TEX-I-1D450","M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z",[1296,1784],{"id":1785,"d":1403},"MJX-5-TEX-N-2217",[1296,1787],{"id":1788,"d":1307},"MJX-5-TEX-I-1D45B",[1296,1790],{"id":1791,"d":1315},"MJX-5-TEX-N-29",[1296,1793],{"id":1794,"d":1319},"MJX-5-TEX-N-2E",[1321,1796,1797],{"stroke":1323,"fill":1323,"stroke-width":796,"transform":1324},[1321,1798,1799,1804,1809,1815,1821,1827,1833],{"dataMmlNode":1327},[1321,1800,1801],{"dataMmlNode":1330},[1332,1802],{"dataC":1334,"xLinkHref":1803},"#MJX-5-TEX-I-1D442",[1321,1805,1806],{"dataMmlNode":1338,"transform":1339},[1332,1807],{"dataC":1342,"xLinkHref":1808},"#MJX-5-TEX-N-28",[1321,1810,1811],{"dataMmlNode":1330,"transform":1347},[1332,1812],{"dataC":1813,"xLinkHref":1814},"1D450","#MJX-5-TEX-I-1D450",[1321,1816,1818],{"dataMmlNode":1338,"transform":1817},"translate(1807.2,0)",[1332,1819],{"dataC":1446,"xLinkHref":1820},"#MJX-5-TEX-N-2217",[1321,1822,1824],{"dataMmlNode":1330,"transform":1823},"translate(2529.4,0)",[1332,1825],{"dataC":1352,"xLinkHref":1826},"#MJX-5-TEX-I-1D45B",[1321,1828,1830],{"dataMmlNode":1338,"transform":1829},"translate(3129.4,0)",[1332,1831],{"dataC":1367,"xLinkHref":1832},"#MJX-5-TEX-N-29",[1321,1834,1836],{"dataMmlNode":1338,"transform":1835},"translate(3518.4,0)",[1332,1837],{"dataC":1374,"xLinkHref":1838},"#MJX-5-TEX-N-2E","\nЗдесь ",[577,1841,1842],{},[417,1843,1844],{},"c"," – некоторый фиксированный промежуток времени для вашего алгоритма. Он называется ",[417,1847,1848],{},"константой",".\nВ функциях из примера время выполнения может составлять 10 миллисекунд * n для ",[473,1851,1762],{}," против 1,0010 секунды * n для ",[473,1854,1855],{},"print_items_sleep",".\nОбычно константа игнорируется, потому что если два алгоритма имеют разное время \"О-большое\", она роли не играет. Для примера возьмём бинарный поиск и простой поиск.\nДопустим, такие константы присутствуют в обоих алгоритмах: 10мс * n для простого поиска и 1сек * log n для бинарного поиска.\nНа первый взгляд раз константа намного меньше у простого поиска то мы можем подумать что алгоритм быстрее. Но стоит предположить что поиск ведётся по списку из 4 миллиардов элементов.\nТогда подставим данные ",[577,1858,1859],{},[417,1860,1861],{},"n"," в формулы мы получим, что время выполнения для простого поиска получится 463 дня, а для бинарного всего лишь 32 секунды(log(4 000 000 000) = 32)!",[406,1864,1865,1866,1871,1872,1875],{},"В некоторых иных случаях ",[417,1867,1868,1869],{},"константа ",[577,1870,1844],{}," может иметь значение. Один из пример — быстрая сортировка и сортировка слиянием.\n",[417,1873,1874],{},"У быстрой сортировки эта константа меньше, чем у сортировки слиянием. Поэтому быстрая сортировка всё равно отработает быстрее чем сортировка слиянием несмотря на \"О-большое\".","\nИ на практике быстрая сортировка срабатывает быстрее, потому что \"средний\" случай встречается намного чаще \"худшего\".\nЧто же такое \"средний\" случай по сравнению с \"худшим\"?",[1877,1878,1880],"h5",{"id":1879},"средний-и-худший-случай","Средний и худший случай",[406,1882,1883],{},"Быстродействие быстрой сортировки сильно зависит от выбранного опорного элемента.\nПредположим, опорным элементом выбирается первый элемент, а быстрая сортировка применяется к уже отсортированному массиву.\nБыстрая сортировка при этом не проверяет, отсортирован входной массив или нет, она всё равно пытается его отсортировать.\nПример стека вызовов, если в качестве опорного элемента всегда выбирать первый элемент:",[441,1885,1886,1889,1892,1895,1898,1901,1904,1907],{},[444,1887,1888],{},"[1, 2, 3, 4, 5, 6, 7, 8]",[444,1890,1891],{},"[] + [1] + [2, 3, 4, 5, 6, 7, 8]",[444,1893,1894],{},"[] + [2] + [3, 4, 5, 6, 7, 8]",[444,1896,1897],{},"[] + [3] + [4, 5, 6, 7, 8]",[444,1899,1900],{},"[] + [4] + [5, 6, 7, 8]",[444,1902,1903],{},"[] + [5] + [6, 7, 8]",[444,1905,1906],{},"[] + [6] + [7, 8]",[444,1908,1909],{},"[] + [7] + [8]",[406,1911,1912],{},"Обратите внимание: массив не разделяется на две половины. Вместо этого один из двух подмассивов всегда пуст, так что стек рекурсивных вызовов функции получится очень длинным.\nТеперь предположим, что в качестве опорного всегда выбирается элемент посередине списка. Посмотрим как будет выглядеть стек вызовов функции в этом случае:",[441,1914,1915,1917,1920,1923],{},[444,1916,1888],{},[444,1918,1919],{},"[1, 2, 3] + [4] + [5, 6, 7, 8]",[444,1921,1922],{},"[1] + [2] + [3]  |  [5] + [6] + [7, 8]",[444,1924,1925],{},"_____________|  [ ] + [7] + [8]",[406,1927,1928],{},"Стек в два раза короче! Список элементов каждый раз в два раза короче! И функция быстрее достигает базового случая!",[406,1930,1931,1932,2098,2099],{},"Первый пример это \"худший сценарий\". Второй – \"лучший\". В \"худшем\" случае размер стека описывается как O(n). В \"лучшем\" случае он составит O(log n).\nНо каким бы способом не был разделён массив – вы всегда обращаетесь к O(n) его элементам.\nПолучается, что \"лучшем\" случае весь алгоритм занимает время: ",[1277,1933,1935],{"className":1934,"jax":1281},[1280],[1283,1936,1939,1972],{"style":1285,"xmlns":1286,"width":1937,"height":1387,"role":670,"focusable":1289,"viewBox":1938,"xmlnsXLink":1291},"29.51ex","0 -750 13043.4 1000",[1293,1940,1941,1944,1947,1950,1953,1956,1959,1962,1965,1969],{},[1296,1942],{"id":1943,"d":1299},"MJX-6-TEX-I-1D442",[1296,1945],{"id":1946,"d":1303},"MJX-6-TEX-N-28",[1296,1948],{"id":1949,"d":1307},"MJX-6-TEX-I-1D45B",[1296,1951],{"id":1952,"d":1315},"MJX-6-TEX-N-29",[1296,1954],{"id":1955,"d":1403},"MJX-6-TEX-N-2217",[1296,1957],{"id":1958,"d":1407},"MJX-6-TEX-I-1D459",[1296,1960],{"id":1961,"d":1411},"MJX-6-TEX-I-1D45C",[1296,1963],{"id":1964,"d":1415},"MJX-6-TEX-I-1D454",[1296,1966],{"id":1967,"d":1968},"MJX-6-TEX-N-3D","M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z",[1296,1970],{"id":1971,"d":1319},"MJX-6-TEX-N-2E",[1321,1973,1974],{"stroke":1323,"fill":1323,"stroke-width":796,"transform":1324},[1321,1975,1976,1981,1986,1991,1996,2002,2007,2012,2018,2024,2030,2035,2040,2047,2052,2057,2062,2067,2072,2077,2082,2087,2092],{"dataMmlNode":1327},[1321,1977,1978],{"dataMmlNode":1330},[1332,1979],{"dataC":1334,"xLinkHref":1980},"#MJX-6-TEX-I-1D442",[1321,1982,1983],{"dataMmlNode":1338,"transform":1339},[1332,1984],{"dataC":1342,"xLinkHref":1985},"#MJX-6-TEX-N-28",[1321,1987,1988],{"dataMmlNode":1330,"transform":1347},[1332,1989],{"dataC":1352,"xLinkHref":1990},"#MJX-6-TEX-I-1D45B",[1321,1992,1993],{"dataMmlNode":1338,"transform":1692},[1332,1994],{"dataC":1367,"xLinkHref":1995},"#MJX-6-TEX-N-29",[1321,1997,1999],{"dataMmlNode":1338,"transform":1998},"translate(2363.2,0)",[1332,2000],{"dataC":1446,"xLinkHref":2001},"#MJX-6-TEX-N-2217",[1321,2003,2005],{"dataMmlNode":1330,"transform":2004},"translate(3085.4,0)",[1332,2006],{"dataC":1334,"xLinkHref":1980},[1321,2008,2010],{"dataMmlNode":1338,"transform":2009},"translate(3848.4,0)",[1332,2011],{"dataC":1342,"xLinkHref":1985},[1321,2013,2015],{"dataMmlNode":1330,"transform":2014},"translate(4237.4,0)",[1332,2016],{"dataC":1453,"xLinkHref":2017},"#MJX-6-TEX-I-1D459",[1321,2019,2021],{"dataMmlNode":1330,"transform":2020},"translate(4535.4,0)",[1332,2022],{"dataC":1460,"xLinkHref":2023},"#MJX-6-TEX-I-1D45C",[1321,2025,2027],{"dataMmlNode":1330,"transform":2026},"translate(5020.4,0)",[1332,2028],{"dataC":1467,"xLinkHref":2029},"#MJX-6-TEX-I-1D454",[1321,2031,2033],{"dataMmlNode":1330,"transform":2032},"translate(5497.4,0)",[1332,2034],{"dataC":1352,"xLinkHref":1990},[1321,2036,2038],{"dataMmlNode":1338,"transform":2037},"translate(6097.4,0)",[1332,2039],{"dataC":1367,"xLinkHref":1995},[1321,2041,2043],{"dataMmlNode":1338,"transform":2042},"translate(6764.2,0)",[1332,2044],{"dataC":2045,"xLinkHref":2046},"3D","#MJX-6-TEX-N-3D",[1321,2048,2050],{"dataMmlNode":1330,"transform":2049},"translate(7820,0)",[1332,2051],{"dataC":1334,"xLinkHref":1980},[1321,2053,2055],{"dataMmlNode":1338,"transform":2054},"translate(8583,0)",[1332,2056],{"dataC":1342,"xLinkHref":1985},[1321,2058,2060],{"dataMmlNode":1330,"transform":2059},"translate(8972,0)",[1332,2061],{"dataC":1352,"xLinkHref":1990},[1321,2063,2065],{"dataMmlNode":1338,"transform":2064},"translate(9794.2,0)",[1332,2066],{"dataC":1446,"xLinkHref":2001},[1321,2068,2070],{"dataMmlNode":1330,"transform":2069},"translate(10516.4,0)",[1332,2071],{"dataC":1453,"xLinkHref":2017},[1321,2073,2075],{"dataMmlNode":1330,"transform":2074},"translate(10814.4,0)",[1332,2076],{"dataC":1460,"xLinkHref":2023},[1321,2078,2080],{"dataMmlNode":1330,"transform":2079},"translate(11299.4,0)",[1332,2081],{"dataC":1467,"xLinkHref":2029},[1321,2083,2085],{"dataMmlNode":1330,"transform":2084},"translate(11776.4,0)",[1332,2086],{"dataC":1352,"xLinkHref":1990},[1321,2088,2090],{"dataMmlNode":1338,"transform":2089},"translate(12376.4,0)",[1332,2091],{"dataC":1367,"xLinkHref":1995},[1321,2093,2095],{"dataMmlNode":1338,"transform":2094},"translate(12765.4,0)",[1332,2096],{"dataC":1374,"xLinkHref":2097},"#MJX-6-TEX-N-2E","\nВ \"худшем\" случае существуют O(n) уровней стека, поэтому алгоритм занимает время: ",[1277,2100,2102],{"className":2101,"jax":1281},[1280],[1283,2103,2106,2132],{"style":1285,"xmlns":1286,"width":2104,"height":1288,"role":670,"focusable":1289,"viewBox":2105,"xmlnsXLink":1291},"21.302ex","0 -833.9 9415.6 1083.9",[1293,2107,2108,2111,2114,2117,2120,2123,2126,2129],{},[1296,2109],{"id":2110,"d":1299},"MJX-7-TEX-I-1D442",[1296,2112],{"id":2113,"d":1303},"MJX-7-TEX-N-28",[1296,2115],{"id":2116,"d":1307},"MJX-7-TEX-I-1D45B",[1296,2118],{"id":2119,"d":1315},"MJX-7-TEX-N-29",[1296,2121],{"id":2122,"d":1403},"MJX-7-TEX-N-2217",[1296,2124],{"id":2125,"d":1968},"MJX-7-TEX-N-3D",[1296,2127],{"id":2128,"d":1311},"MJX-7-TEX-N-32",[1296,2130],{"id":2131,"d":1319},"MJX-7-TEX-N-2E",[1321,2133,2134],{"stroke":1323,"fill":1323,"stroke-width":796,"transform":1324},[1321,2135,2136,2141,2146,2151,2156,2161,2165,2169,2173,2178,2184,2189,2194,2206,2211],{"dataMmlNode":1327},[1321,2137,2138],{"dataMmlNode":1330},[1332,2139],{"dataC":1334,"xLinkHref":2140},"#MJX-7-TEX-I-1D442",[1321,2142,2143],{"dataMmlNode":1338,"transform":1339},[1332,2144],{"dataC":1342,"xLinkHref":2145},"#MJX-7-TEX-N-28",[1321,2147,2148],{"dataMmlNode":1330,"transform":1347},[1332,2149],{"dataC":1352,"xLinkHref":2150},"#MJX-7-TEX-I-1D45B",[1321,2152,2153],{"dataMmlNode":1338,"transform":1692},[1332,2154],{"dataC":1367,"xLinkHref":2155},"#MJX-7-TEX-N-29",[1321,2157,2158],{"dataMmlNode":1338,"transform":1998},[1332,2159],{"dataC":1446,"xLinkHref":2160},"#MJX-7-TEX-N-2217",[1321,2162,2163],{"dataMmlNode":1330,"transform":2004},[1332,2164],{"dataC":1334,"xLinkHref":2140},[1321,2166,2167],{"dataMmlNode":1338,"transform":2009},[1332,2168],{"dataC":1342,"xLinkHref":2145},[1321,2170,2171],{"dataMmlNode":1330,"transform":2014},[1332,2172],{"dataC":1352,"xLinkHref":2150},[1321,2174,2176],{"dataMmlNode":1338,"transform":2175},"translate(4837.4,0)",[1332,2177],{"dataC":1367,"xLinkHref":2155},[1321,2179,2181],{"dataMmlNode":1338,"transform":2180},"translate(5504.2,0)",[1332,2182],{"dataC":2045,"xLinkHref":2183},"#MJX-7-TEX-N-3D",[1321,2185,2187],{"dataMmlNode":1330,"transform":2186},"translate(6560,0)",[1332,2188],{"dataC":1334,"xLinkHref":2140},[1321,2190,2192],{"dataMmlNode":1338,"transform":2191},"translate(7323,0)",[1332,2193],{"dataC":1342,"xLinkHref":2145},[1321,2195,2197,2201],{"dataMmlNode":1346,"transform":2196},"translate(7712,0)",[1321,2198,2199],{"dataMmlNode":1330},[1332,2200],{"dataC":1352,"xLinkHref":2150},[1321,2202,2203],{"dataMmlNode":1356,"transform":1357},[1332,2204],{"dataC":1360,"xLinkHref":2205},"#MJX-7-TEX-N-32",[1321,2207,2209],{"dataMmlNode":1338,"transform":2208},"translate(8748.6,0)",[1332,2210],{"dataC":1367,"xLinkHref":2155},[1321,2212,2214],{"dataMmlNode":1338,"transform":2213},"translate(9137.6,0)",[1332,2215],{"dataC":1374,"xLinkHref":2216},"#MJX-7-TEX-N-2E",[406,2218,2219],{},"А теперь главное: \"лучший\" случай это \"средний\" случай. Если вы всегда будите выбирать опорным элементом случайный элемент в массиве, то быстрая сортировка в среднем завершится за время O(n * logn).\nЗа одним исключением: если все элементы массива одинаковы, тогда время выполнения будет худшим. Но на сегодняшний день алгоритм быстрой сортировки – один из самых быстрых алгоритмов сортировки, который также является примером для стратегии \"разделяй и властвуй\".",[406,2221,2222,2223,2226,2227,2230],{},"Попробуйте сами скопировать и запустить код в окне ниже с интерпретатором Python и повторите примеры из статьи чтобы самим увидеть и понять как всё это работает.\nДля этого в ячейке с кодом нажмите клавиши на клавиатуре ",[577,2224,2225],{},"Shift+Enter"," или запустите код через ",[577,2228,2229],{},"кнопку Run"," по значку ▶.",[2232,2233],"jypiter",{},[426,2235],{"id":471},[2237,2238],"card-collapsible-num-answers",{":isAnswers":2239,":isList":2240,":startOl":742,"isText":2241,"title":2242},"[\"O(n)\",\"O(n)\",\"O(1)\",\"O(n * n)\"]","[\"Вывод значения каждого элемента массива.\",\"Удвоение значения каждого элемента массива.\",\"Удвоение значения только первого элемента массива\",\"Создание таблицы умножения друг на друга для каждого из элементов массива.\"]","Определите \"О-большое\" для каждой из следующих операций","УПРАЖНЕНИЯ",[1253,2244],{"id":2245},"_1",[401,2247],{":isList":2248,"title":2249},"[\"Стратегия \\\"разделяй и властвуй\\\" основана на разбиении задачи на подзадачи. Если эту стратегию использовать со списком или массивом, то базовым случаем, скорее всего будет пустой список или список из одного элемента;\",\"Если вы реализуете алгоритм быстрой сортировки, выберите в качестве опорного элемента случайный элемент;\",\"Из двух алгоритмов с одинаковым временем выполнения \\\"О-большое\\\" один может быть быстрее другого. Именно по этому быстрая сортировка быстрее сортировки слиянием;\",\"При сравнении простой сортировки и бинарной константа почти никогда не играет роли, потому что O(log n) слишком сильно превосходит O(n) по скорости при большом размере массива.\"]","ШПАРГАЛКА",[2251,2252,2253],"style",{},"\nmjx-container[jax=\"SVG\"] {\n  direction: ltr;\n}\n\nmjx-container[jax=\"SVG\"] > svg {\n  overflow: visible;\n  min-height: 1px;\n  min-width: 1px;\n}\n\nmjx-container[jax=\"SVG\"] > svg a {\n  fill: blue;\n  stroke: blue;\n}\n\nmjx-container[jax=\"SVG\"][display=\"true\"] {\n  display: block;\n  text-align: center;\n  margin: 1em 0;\n}\n\nmjx-container[jax=\"SVG\"][display=\"true\"][width=\"full\"] {\n  display: flex;\n}\n\nmjx-container[jax=\"SVG\"][justify=\"left\"] {\n  text-align: left;\n}\n\nmjx-container[jax=\"SVG\"][justify=\"right\"] {\n  text-align: right;\n}\n\ng[data-mml-node=\"merror\"] > g {\n  fill: red;\n  stroke: red;\n}\n\ng[data-mml-node=\"merror\"] > rect[data-background] {\n  fill: yellow;\n  stroke: none;\n}\n\ng[data-mml-node=\"mtable\"] > line[data-line], svg[data-table] > g > line[data-line] {\n  stroke-width: 70px;\n  fill: none;\n}\n\ng[data-mml-node=\"mtable\"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {\n  stroke-width: 70px;\n  fill: none;\n}\n\ng[data-mml-node=\"mtable\"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {\n  stroke-dasharray: 140;\n}\n\ng[data-mml-node=\"mtable\"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {\n  stroke-linecap: round;\n  stroke-dasharray: 0,140;\n}\n\ng[data-mml-node=\"mtable\"] > g > svg {\n  overflow: visible;\n}\n\n[jax=\"SVG\"] mjx-tool {\n  display: inline-block;\n  position: relative;\n  width: 0;\n  height: 0;\n}\n\n[jax=\"SVG\"] mjx-tool > mjx-tip {\n  position: absolute;\n  top: 0;\n  left: 0;\n}\n\nmjx-tool > mjx-tip {\n  display: inline-block;\n  padding: .2em;\n  border: 1px solid #888;\n  font-size: 70%;\n  background-color: #F8F8F8;\n  color: black;\n  box-shadow: 2px 2px 5px #AAAAAA;\n}\n\ng[data-mml-node=\"maction\"][data-toggle] {\n  cursor: pointer;\n}\n\nmjx-status {\n  display: block;\n  position: fixed;\n  left: 1em;\n  bottom: 1em;\n  min-width: 25%;\n  padding: .2em .4em;\n  border: 1px solid #888;\n  font-size: 90%;\n  background-color: #F8F8F8;\n  color: black;\n}\n\nforeignObject[data-mjx-xml] {\n  font-family: initial;\n  line-height: normal;\n  overflow: visible;\n}\n\nmjx-container[jax=\"SVG\"] path[data-c], mjx-container[jax=\"SVG\"] use[data-c] {\n  stroke-width: 3;\n}\n",[2251,2255,2256],{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":471,"searchDepth":494,"depth":534,"links":2258},[2259],{"id":399,"depth":494,"text":270,"children":2260},[2261,2262,2268],{"id":428,"depth":507,"text":429},{"id":875,"depth":507,"text":270,"children":2263},[2264,2265],{"id":1255,"depth":522,"text":1256},{"id":1604,"depth":522,"text":1605,"children":2266},[2267],{"id":1879,"depth":534,"text":1880},{"id":471,"depth":507,"text":471,"children":2269},[2270],{"id":2245,"depth":522,"text":471},"2025-11-27","Алгоритм быстрой сортировки массива. Стратегия \"Разделяй и властвуй\"","md","images\u002Fblog\u002Fpython\u002Fst28\u002Fimg.png",{},28,{"title":270,"description":2272},"2XcrqR_ezFvqUQ_zWDfB_LMsAH7FKRPbAR8FTiVuPcM",[2280,2282],{"title":266,"path":267,"stem":268,"description":2281,"children":-1},"Алгоритм рекурсии и понятие стек вызовов функции",{"title":274,"path":275,"stem":276,"description":2283,"children":-1},"Алгоритм поиска в ширину на графах для поиска кратчайших путей. Топологическая сортировка.",1780737510354]