1 00:00:00,000 --> 00:00:04,419 >> [Играет музыка] 2 00:00:04,419 --> 00:00:05,401 3 00:00:05,401 --> 00:00:08,460 >> ДАГ Lloyd: ОК, так что слияние рода является еще одним алгоритмом 4 00:00:08,460 --> 00:00:11,200 что мы можем использовать, чтобы разобраться элементы массива. 5 00:00:11,200 --> 00:00:14,480 Но, как мы увидим, он получил очень принципиальная разница 6 00:00:14,480 --> 00:00:17,850 от выбора сорта, пузырь сортировать и сортировка вставками 7 00:00:17,850 --> 00:00:20,280 которые делают его действительно очень умный. 8 00:00:20,280 --> 00:00:24,290 >> Основная идея слияния сортировки для сортировки мелких массивов 9 00:00:24,290 --> 00:00:27,430 а затем объединить эти массивы вместе, или объединить them-- 10 00:00:27,430 --> 00:00:31,440 следовательно name-- в отсортированном порядке. 11 00:00:31,440 --> 00:00:34,230 Таким образом, что сортировка слиянием делает это, используя инструмент 12 00:00:34,230 --> 00:00:37,290 называется рекурсия, что и мы будем говорить о в ближайшее время, 13 00:00:37,290 --> 00:00:39,720 но мы не говорили о еще. 14 00:00:39,720 --> 00:00:43,010 >> Вот основная идея сортировки слиянием. 15 00:00:43,010 --> 00:00:46,320 Сортировать левую половину массива, при условии, N больше 1. 16 00:00:46,320 --> 00:00:49,980 И то, что я имею в виду, когда говорю, при условии, N больше, чем 1, 17 00:00:49,980 --> 00:00:53,970 Я думаю, что мы можем согласиться, что, если массив состоит только из одного элемента, 18 00:00:53,970 --> 00:00:54,680 это сортируется. 19 00:00:54,680 --> 00:00:56,560 Мы не на самом деле нужно чтобы сделать что-нибудь с ним. 20 00:00:56,560 --> 00:00:58,059 Мы можем просто объявить его быть отсортированы. 21 00:00:58,059 --> 00:01:00,110 Это всего лишь один элемент. 22 00:01:00,110 --> 00:01:03,610 >> Так псевдокод, опять же, сортировать левую половину массива, 23 00:01:03,610 --> 00:01:08,590 затем отсортировать правая половина массив, а затем объединить две половинки вместе. 24 00:01:08,590 --> 00:01:11,040 Теперь, уже вы могли бы быть думая, что это вроде только 25 00:01:11,040 --> 00:01:14,080 Похоже, вы откладывали the-- Вы на самом деле не делают ничего. 26 00:01:14,080 --> 00:01:16,330 Вы говорите отсортировать левую половина, сортировать правую половину, 27 00:01:16,330 --> 00:01:19,335 но ты не говоришь мне, как ты это делаешь. 28 00:01:19,335 --> 00:01:22,220 >> Но помните, что пока массив является единственным элементом, 29 00:01:22,220 --> 00:01:23,705 мы можем объявить его сортировать. 30 00:01:23,705 --> 00:01:25,330 Тогда мы можем просто объединить их вместе. 31 00:01:25,330 --> 00:01:27,788 И это на самом деле Основная идея позади сортировки слиянием, 32 00:01:27,788 --> 00:01:31,150 это разбить его таким образом, что Ваши массивы имеют размер одного. 33 00:01:31,150 --> 00:01:33,430 И тогда вы восстановить оттуда. 34 00:01:33,430 --> 00:01:35,910 >> Слияние рода, безусловно, сложный алгоритм. 35 00:01:35,910 --> 00:01:38,210 И это также немного сложнее визуализировать. 36 00:01:38,210 --> 00:01:41,870 Так, мы надеемся, визуализация, что я есть здесь, поможет Вам следовать вдоль. 37 00:01:41,870 --> 00:01:45,640 И я буду стараться изо всех сил, чтобы рассказать вещи и пройти через это немного больше, 38 00:01:45,640 --> 00:01:49,180 медленнее, чем остальных просто мы надеемся получить вашу голову 39 00:01:49,180 --> 00:01:51,800 вокруг идей, лежащих сортировки слиянием. 40 00:01:51,800 --> 00:01:54,680 >> Итак, мы имеем тот же массив в качестве другие алгоритм сортировки видео 41 00:01:54,680 --> 00:01:57,120 если вы видели them-- Массив шесть элемент. 42 00:01:57,120 --> 00:02:02,110 И наша псевдокод здесь код является своего рода левая половина, сортировать правую половину, 43 00:02:02,110 --> 00:02:03,890 объединить две половинки вместе. 44 00:02:03,890 --> 00:02:09,770 Итак, давайте это очень темно красный кирпич массива и отсортировать левую половину. 45 00:02:09,770 --> 00:02:13,380 >> Так на данный момент, мы собираемся игнорировать вещи справа. 46 00:02:13,380 --> 00:02:15,740 Это там, но мы не на этом шаге еще. 47 00:02:15,740 --> 00:02:18,220 Мы не Сортировка Правая половина массива. 48 00:02:18,220 --> 00:02:21,037 Мы в то левого половина массива. 49 00:02:21,037 --> 00:02:22,870 И только ради быть немного более 50 00:02:22,870 --> 00:02:26,480 ясно, так что я могу обратиться на то, что шаг мы на, 51 00:02:26,480 --> 00:02:29,800 Я собираюсь переключить Цвет этого набора апельсина. 52 00:02:29,800 --> 00:02:33,190 Теперь, мы все еще говорим о же левая половина исходного массива. 53 00:02:33,190 --> 00:02:38,520 Но я надеюсь, что, будучи в состоянии см цвета различных предметов, 54 00:02:38,520 --> 00:02:40,900 это сделает его немного более ясно, что здесь происходит. 55 00:02:40,900 --> 00:02:43,270 >> ОК, так что теперь у нас есть три элемента массива. 56 00:02:43,270 --> 00:02:46,420 Как мы сортируем левую половину этого Массив, который до сих пор этот шаг? 57 00:02:46,420 --> 00:02:49,400 Мы пытаемся, чтобы отсортировать левую половина из красного кирпича array-- 58 00:02:49,400 --> 00:02:52,410 левая половина которого Я теперь окрашены в оранжевый цвет. 59 00:02:52,410 --> 00:02:54,840 >> Ну, мы могли бы попытаться повторить этот процесс снова. 60 00:02:54,840 --> 00:02:56,756 Таким образом, мы все еще в Середина пытаясь разобраться 61 00:02:56,756 --> 00:02:58,700 левая половина полной массива. 62 00:02:58,700 --> 00:03:00,450 Левая половина Массив, я только собираюсь 63 00:03:00,450 --> 00:03:03,910 произвольно решать, что левая половина будет меньше, чем в правой половине, 64 00:03:03,910 --> 00:03:06,550 потому что это происходит с состоит из трех элементов. 65 00:03:06,550 --> 00:03:11,260 >> И поэтому я хочу сказать, что левая половина левой половине массива 66 00:03:11,260 --> 00:03:14,050 это просто элемент пять. 67 00:03:14,050 --> 00:03:18,360 Пять, будучи один элемент Массив, мы знаем, как разбираться. 68 00:03:18,360 --> 00:03:21,615 И так пять сортируется. 69 00:03:21,615 --> 00:03:22,990 Мы просто заявить, что. 70 00:03:22,990 --> 00:03:24,890 Это один элемент массива. 71 00:03:24,890 --> 00:03:29,015 >> Таким образом, мы в настоящее время сортируются левая половина левой half-- 72 00:03:29,015 --> 00:03:33,190 вернее, мы отсортированы левая половина апельсина. 73 00:03:33,190 --> 00:03:37,970 Так что теперь, для того, чтобы по-прежнему полная левая половина общего массива, 74 00:03:37,970 --> 00:03:43,481 мы должны разобраться в правую половину апельсина, или этот материал. 75 00:03:43,481 --> 00:03:44,230 Как мы это делаем? 76 00:03:44,230 --> 00:03:45,930 Ну, у нас есть массив из двух элементов. 77 00:03:45,930 --> 00:03:50,470 Таким образом, мы можем отсортировать левую половину массива, который два. 78 00:03:50,470 --> 00:03:52,090 Два это единственный элемент. 79 00:03:52,090 --> 00:03:55,890 Так что это сортируется по умолчанию. Тогда мы можем отсортировать правую половину 80 00:03:55,890 --> 00:03:58,530 той части массива, один. 81 00:03:58,530 --> 00:04:00,210 Это своего рода по умолчанию. 82 00:04:00,210 --> 00:04:03,610 >> Теперь это в первый раз мы достигли шаг слияния. 83 00:04:03,610 --> 00:04:06,135 Мы завершили, хотя мы теперь вид вложенных down-- 84 00:04:06,135 --> 00:04:08,420 и это своего рода хитрый что с рекурсии, 85 00:04:08,420 --> 00:04:10,930 Вы должны держать голову о том, где мы находимся. 86 00:04:10,930 --> 00:04:15,560 Таким образом, мы своего рода слева половина оранжевого части. 87 00:04:15,560 --> 00:04:21,280 >> И теперь, мы находимся в середине сортировки правая половина оранжевого части. 88 00:04:21,280 --> 00:04:25,320 И в этом процессе, мы теперь собирается быть на шаг, 89 00:04:25,320 --> 00:04:27,850 объединить две половинки вместе. 90 00:04:27,850 --> 00:04:31,700 Когда мы смотрим на две половины массива, мы видим два и один. 91 00:04:31,700 --> 00:04:33,880 Какой элемент меньше? 92 00:04:33,880 --> 00:04:35,160 Один. 93 00:04:35,160 --> 00:04:36,760 >> Тогда, какой элемент меньше? 94 00:04:36,760 --> 00:04:38,300 Ну, это два или ничего. 95 00:04:38,300 --> 00:04:39,910 Так что это два. 96 00:04:39,910 --> 00:04:43,690 Так что теперь, просто снова кадр где мы находимся в контексте 97 00:04:43,690 --> 00:04:48,230 мы сортируются левая половина апельсина 98 00:04:48,230 --> 00:04:49,886 а правая половина происхождения. 99 00:04:49,886 --> 00:04:52,510 Я знаю, что я изменил цвета снова, но это, где мы были. 100 00:04:52,510 --> 00:04:54,676 И причина Я сделал это в том, что этот процесс 101 00:04:54,676 --> 00:04:57,870 продолжать идти, повторяя вниз. 102 00:04:57,870 --> 00:05:00,500 Мы отсортировали левый половина бывшего оранжевого 103 00:05:00,500 --> 00:05:02,590 а правая половина прежнего оранжевого цвета. 104 00:05:02,590 --> 00:05:05,620 >> Теперь нам нужно объединить тех, две половинки вместе тоже. 105 00:05:05,620 --> 00:05:07,730 Это шаг, который мы сейчас находитесь. 106 00:05:07,730 --> 00:05:11,440 Таким образом, мы рассмотрим все из элементы, которые в настоящее время являются зеленый, 107 00:05:11,440 --> 00:05:12,972 левая половина исходного массива. 108 00:05:12,972 --> 00:05:14,680 И мы объединяем тех, используя тот же самый процесс 109 00:05:14,680 --> 00:05:18,660 мы сделали для объединения двух и один только момент назад. 110 00:05:18,660 --> 00:05:23,080 >> Левая половина, наименьший элемент на левой половине пять. 111 00:05:23,080 --> 00:05:25,620 Наименьшее элемент на правая половина является одним. 112 00:05:25,620 --> 00:05:27,370 Какой из них является меньше? 113 00:05:27,370 --> 00:05:29,260 Один. 114 00:05:29,260 --> 00:05:32,250 >> Наименьшее элемент на левая половина пять. 115 00:05:32,250 --> 00:05:35,540 Наименьшее элемент на правая половина это два. 116 00:05:35,540 --> 00:05:36,970 Что наименьшее? 117 00:05:36,970 --> 00:05:38,160 Два. 118 00:05:38,160 --> 00:05:41,540 И тогда, наконец, пять ничего, мы можем сказать, пять. 119 00:05:41,540 --> 00:05:43,935 >> Итак, картина, давайте перерыв на секунду 120 00:05:43,935 --> 00:05:46,080 и выяснить, где мы находимся. 121 00:05:46,080 --> 00:05:48,580 Если бы мы начали с в самом начале, мы 122 00:05:48,580 --> 00:05:51,640 Теперь завершены общая массив только 123 00:05:51,640 --> 00:05:53,810 один шаг кода псевдокода здесь. 124 00:05:53,810 --> 00:05:56,645 Мы сортируются левая половина массива. 125 00:05:56,645 --> 00:05:59,490 >> Напомним, что оригинальный Приказ был пять, два, один. 126 00:05:59,490 --> 00:06:02,570 Идя через этот процесс и гнездования вниз и повторять, 127 00:06:02,570 --> 00:06:05,990 продолжая нарушать проблему на более мелкие и более мелкие части, 128 00:06:05,990 --> 00:06:09,670 мы уже завершили шаг один из псевдокода 129 00:06:09,670 --> 00:06:13,940 в течение всего начальной массива. 130 00:06:13,940 --> 00:06:16,670 Мы разобрались левую половину. 131 00:06:16,670 --> 00:06:18,670 >> Так что теперь давайте заморозить там. 132 00:06:18,670 --> 00:06:23,087 А теперь давайте разберёмся право половина исходного массива. 133 00:06:23,087 --> 00:06:25,670 И мы собираемся сделать это, переживает то же самое итеративный 134 00:06:25,670 --> 00:06:30,630 процесс разрушения вещи вниз , а затем объединять их вместе. 135 00:06:30,630 --> 00:06:34,290 >> Таким образом, левая половина из красный или левая половина 136 00:06:34,290 --> 00:06:38,830 правой половины первоначального Массив, я собираюсь сказать, три. 137 00:06:38,830 --> 00:06:40,312 Опять же, я здесь быть последовательным. 138 00:06:40,312 --> 00:06:42,020 Если у вас есть нечетное Количество элементов, его 139 00:06:42,020 --> 00:06:44,478 на самом деле не имеет значения, Вы делаете левая меньше 140 00:06:44,478 --> 00:06:45,620 или право поменьше. 141 00:06:45,620 --> 00:06:49,230 >> Важно то, что всякий раз, когда вам столкнулись с этой проблемой в проведении 142 00:06:49,230 --> 00:06:51,422 слияние, вам нужно быть последовательным. 143 00:06:51,422 --> 00:06:53,505 Вы либо должны всегда сделать левая сторона меньше 144 00:06:53,505 --> 00:06:55,421 или всегда нужно сделать правая сторона меньше. 145 00:06:55,421 --> 00:06:57,720 Здесь я выбрал, чтобы всегда сделать левая сторона меньше 146 00:06:57,720 --> 00:07:04,380 когда мой массив, или мой суб-массива, является нечетной размера. 147 00:07:04,380 --> 00:07:07,420 >> Три есть один элемент, и поэтому он отсортирован. 148 00:07:07,420 --> 00:07:10,860 Мы использовала это предположение на протяжении всей нашей процессе до сих пор. 149 00:07:10,860 --> 00:07:15,020 Так что теперь давайте разберёмся право половина правой половине, 150 00:07:15,020 --> 00:07:18,210 или правая половина красного. 151 00:07:18,210 --> 00:07:20,390 >> Опять же, мы должны разделить это вниз. 152 00:07:20,390 --> 00:07:21,910 Это не единственный элемент массива. 153 00:07:21,910 --> 00:07:23,970 Мы не можем объявить его сортировать. 154 00:07:23,970 --> 00:07:27,060 И так во-первых, мы собираемся сортировать левую половину. 155 00:07:27,060 --> 00:07:31,620 >> Левая половина один элемент, так что это своего рода по умолчанию. 156 00:07:31,620 --> 00:07:34,840 Тогда мы идем, чтобы отсортировать право половина, что один элемент. 157 00:07:34,840 --> 00:07:41,250 Это сортируются по умолчанию. И сейчас, мы можем объединить эти два вместе. 158 00:07:41,250 --> 00:07:45,820 Четыре меньше, и затем шесть меньше. 159 00:07:45,820 --> 00:07:48,870 >> Опять же, то, что мы сделали в этот момент? 160 00:07:48,870 --> 00:07:52,512 Мы отсортировали левый половина правой половине. 161 00:07:52,512 --> 00:07:54,720 Или вернуться к оригиналу цвета, которые были там, 162 00:07:54,720 --> 00:07:57,875 мы отсортировали левый половина мягкого красного. 163 00:07:57,875 --> 00:08:00,416 Первоначально он был темно-кирпич красный и теперь это мягче красный, 164 00:08:00,416 --> 00:08:02,350 или это была мягче красный. 165 00:08:02,350 --> 00:08:05,145 >> А потом мы сортируются Правая половина мягкого красного. 166 00:08:05,145 --> 00:08:08,270 Теперь, хорошо, они зеленые снова, только потому что мы собираемся через процесс. 167 00:08:08,270 --> 00:08:10,720 И мы должны повторить это снова и снова. 168 00:08:10,720 --> 00:08:14,695 >> Так что теперь мы можем объединить тех, две половинки вместе. 169 00:08:14,695 --> 00:08:15,820 И это то, что мы делаем здесь. 170 00:08:15,820 --> 00:08:17,653 Так черной линии только разделить левую половину 171 00:08:17,653 --> 00:08:19,690 а правая половина этого рода части. 172 00:08:19,690 --> 00:08:24,310 >> Мы сравниваем наименьшее значение на левой стороне array-- 173 00:08:24,310 --> 00:08:26,710 или, простите, наименьшая Значение левой половине 174 00:08:26,710 --> 00:08:30,790 наименьшему значению права половина и обнаружили, что три меньше. 175 00:08:30,790 --> 00:08:32,530 А теперь немного оптимизации, верно? 176 00:08:32,530 --> 00:08:35,175 Там самом деле ничего оставили на левой стороне. 177 00:08:35,175 --> 00:08:37,440 >> Там нет ничего остальные с левой стороны, 178 00:08:37,440 --> 00:08:40,877 поэтому мы можем эффективно просто move-- мы можем объявить 179 00:08:40,877 --> 00:08:42,960 остальное на самом деле сортируются и только лавировать его 180 00:08:42,960 --> 00:08:45,126 на, потому что нет ничего еще для сравнения. 181 00:08:45,126 --> 00:08:49,140 И мы знаем, что правая сторона с правой стороны сортируется. 182 00:08:49,140 --> 00:08:52,770 >> ОК, так что теперь давайте снова и заморозить выяснить, где мы находимся в истории. 183 00:08:52,770 --> 00:08:56,120 В общем массиве, Что мы сделали? 184 00:08:56,120 --> 00:08:58,790 Мы на самом деле выполнить Теперь шаги одно и второй этап. 185 00:08:58,790 --> 00:09:03,300 Мы отсортировали левую половину, и мы отсортировали правую половину. 186 00:09:03,300 --> 00:09:08,210 >> Так что теперь, все, что остается для нас объединить эти две половинки вместе. 187 00:09:08,210 --> 00:09:11,670 Таким образом, мы сравниваем самый низкий ценится элемент каждой половине массива 188 00:09:11,670 --> 00:09:13,510 в свою очередь, и продолжить. 189 00:09:13,510 --> 00:09:16,535 Одним из них является менее чем три, так что идет. 190 00:09:16,535 --> 00:09:19,770 >> Два меньше трех, так что два идет. 191 00:09:19,770 --> 00:09:22,740 Три менее чем 5, так три идет. 192 00:09:22,740 --> 00:09:25,820 Четыре меньше, чем 5, так четверка заходит. 193 00:09:25,820 --> 00:09:30,210 Тогда пять меньше, чем шесть, и шесть это все, что остается. 194 00:09:30,210 --> 00:09:31,820 >> Теперь, я знаю, что было много шагов. 195 00:09:31,820 --> 00:09:33,636 И мы оставили много памяти в нашей волне. 196 00:09:33,636 --> 00:09:35,260 И это то, что эти серые квадраты. 197 00:09:35,260 --> 00:09:40,540 И это, вероятно, чувствовал, что это взял гораздо дольше, чем вставки рода, пузырь 198 00:09:40,540 --> 00:09:42,660 сортировать, или выбор рода. 199 00:09:42,660 --> 00:09:45,330 >> Но на самом деле, потому что Многие из этих процессов 200 00:09:45,330 --> 00:09:48,260 происходят в то же time-- что то, что мы будем, опять же, 201 00:09:48,260 --> 00:09:51,100 говорить, когда мы говорим о рекурсия в будущем video-- 202 00:09:51,100 --> 00:09:53,799 этот алгоритм на самом деле ясно принципиально 203 00:09:53,799 --> 00:09:55,590 отличается от всего, мы видели раньше 204 00:09:55,590 --> 00:09:58,820 но также значительно более эффективным. 205 00:09:58,820 --> 00:09:59,532 >> Почему это? 206 00:09:59,532 --> 00:10:01,240 Ну, в худшем сценарий, у нас есть 207 00:10:01,240 --> 00:10:04,830 разделить п элементов до а затем сливают. 208 00:10:04,830 --> 00:10:06,680 Но когда мы воссоединить им, что мы делаем 209 00:10:06,680 --> 00:10:11,110 в основном удвоение Размер меньших массивов. 210 00:10:11,110 --> 00:10:14,260 У нас есть куча одного элемента массивы, которые мы эффективно 211 00:10:14,260 --> 00:10:16,290 объединить в двух массивах элементов. 212 00:10:16,290 --> 00:10:18,590 А потом мы возьмем тех, два массива элемент 213 00:10:18,590 --> 00:10:21,890 и объединить их вместе в четыре массива элементов, и так далее, 214 00:10:21,890 --> 00:10:26,130 не и так далее, и так далее, до тех пор, есть один массив п элементов. 215 00:10:26,130 --> 00:10:29,910 >> Но сколько удвоения это, чтобы добраться до п? 216 00:10:29,910 --> 00:10:31,460 Вспомните, например телефонной книги. 217 00:10:31,460 --> 00:10:34,490 Сколько раз мы должны рвать телефонная книга на половину, сколько еще 218 00:10:34,490 --> 00:10:38,370 раз мы должны рвать телефонную книгу пополам, если размер телефонной книги 219 00:10:38,370 --> 00:10:39,680 в два раза? 220 00:10:39,680 --> 00:10:41,960 Там только один, верно? 221 00:10:41,960 --> 00:10:45,360 >> Так что какая-то логарифмическая элементом здесь. 222 00:10:45,360 --> 00:10:48,590 Но мы также все еще есть, по крайней мере смотреть на все п элементов. 223 00:10:48,590 --> 00:10:53,860 Таким образом, в худшем случае, сортировка слиянием работает в п журнала п. 224 00:10:53,860 --> 00:10:56,160 Мы должны смотреть на все п элементов, 225 00:10:56,160 --> 00:11:02,915 и мы должны объединить их вместе в журнале н наборов шагов. 226 00:11:02,915 --> 00:11:05,290 В лучшем случае, массив прекрасно отсортированы. 227 00:11:05,290 --> 00:11:06,300 Замечательно. 228 00:11:06,300 --> 00:11:09,980 Но на основе алгоритма мы имеем здесь, мы все еще должны разделить, а затем. 229 00:11:09,980 --> 00:11:13,290 Хотя в этом случае рекомбинирующий вроде неэффективными. 230 00:11:13,290 --> 00:11:14,720 Она не нужна. 231 00:11:14,720 --> 00:11:17,580 Но мы по-прежнему идти через весь процесс в любом случае. 232 00:11:17,580 --> 00:11:21,290 >> Таким образом, в лучшем случае а в худшем случае, 233 00:11:21,290 --> 00:11:24,970 этот алгоритм работает в журнале н н времени. 234 00:11:24,970 --> 00:11:29,130 Слияние рода, безусловно, немного сложнее чем других основных алгоритмов сортировки 235 00:11:29,130 --> 00:11:33,470 мы говорили о CS50, но существенно более мощным. 236 00:11:33,470 --> 00:11:35,400 >> И поэтому, если вы когда-нибудь найти Поводом для это нужно 237 00:11:35,400 --> 00:11:38,480 или использовать его для сортировки большой набор данных, получение 238 00:11:38,480 --> 00:11:41,940 Ваша голова вокруг идеи рекурсии будет очень мощный. 239 00:11:41,940 --> 00:11:45,270 И это будет сделать свой программы действительно намного эффективнее 240 00:11:45,270 --> 00:11:48,700 с помощью сортировка слиянием против что-нибудь еще. 241 00:11:48,700 --> 00:11:49,640 Я Дуг Ллойд. 242 00:11:49,640 --> 00:11:51,970 Это CS50. 243 00:11:51,970 --> 00:11:53,826