1 00:00:00,000 --> 00:00:07,270 2 00:00:07,270 --> 00:00:10,390 >> МАРК GROZEN-Смит: Здраво, јас сум Марк Grozen-Смит, и ова е Quicksort. 3 00:00:10,390 --> 00:00:13,520 Исто како и вметнување вид и меур вид, Quicksort е алгоритам за 4 00:00:13,520 --> 00:00:15,720 сортирање листа или низа на работи. 5 00:00:15,720 --> 00:00:19,080 За едноставност, да претпоставиме дека оние работи се само цели броеви, но 6 00:00:19,080 --> 00:00:22,060 знаете дека Quicksort работи за повеќе од само бројки. 7 00:00:22,060 --> 00:00:24,720 Quickstart е малку повеќе комплицирано од вметнување или балон, но тоа е 8 00:00:24,720 --> 00:00:27,560 исто така многу поефикасно во повеќето случаи. 9 00:00:27,560 --> 00:00:28,150 Чекај една секунда. 10 00:00:28,150 --> 00:00:30,760 Дали тој само велат "повеќето случаи, "не" сите "? 11 00:00:30,760 --> 00:00:31,710 Интересно, бр. 12 00:00:31,710 --> 00:00:33,560 Не сите случаи се исти. 13 00:00:33,560 --> 00:00:36,650 Не грижете се за овој детал ако не сум ја видел голема О нотација уште, но 14 00:00:36,650 --> 00:00:39,730 Quicksort е О (n квадрат) алгоритам во најлош случај, исто како и 15 00:00:39,730 --> 00:00:41,430 вметнување или балон вид. 16 00:00:41,430 --> 00:00:44,950 Сепак, тоа обично делува многу повеќе како старите аналогни метри алгоритам. 17 00:00:44,950 --> 00:00:45,750 Зошто? 18 00:00:45,750 --> 00:00:46,810 Ние ќе се вратам на тоа подоцна. 19 00:00:46,810 --> 00:00:49,610 Но, за сега, ајде да дознаете како Quicksort работи. 20 00:00:49,610 --> 00:00:53,080 >> Па ајде да одиме преку Quicksorting овој низа од цели броеви од најмалите 21 00:00:53,080 --> 00:00:54,260 на најголемата. 22 00:00:54,260 --> 00:01:00,110 Тука имаме цели броеви 6, 5, 1, 3, 8, 4, 7, 9, и 2. 23 00:01:00,110 --> 00:01:03,480 Прво, ние го избере конечниот елемент на оваа низа - во овој случај, две - 24 00:01:03,480 --> 00:01:06,870 и повик дека "стожерот". Следниот, ние почнете да се погледне две работи - 25 00:01:06,870 --> 00:01:10,220 еден, што е најниско индекс, кој ќе се однесува како престојуваат на правото на 26 00:01:10,220 --> 00:01:13,970 ѕидот, и две, најлева елемент, кој ќе викнам "тековната 27 00:01:13,970 --> 00:01:17,260 елемент. "Она што се случува да направите е изгледа сите други елементи, други 28 00:01:17,260 --> 00:01:20,930 од стожерот, и го стави сите елементи помал од стожерот на 29 00:01:20,930 --> 00:01:24,140 лево од ѕидот и сите оние поголема од стожерот на 30 00:01:24,140 --> 00:01:25,570 правото на ѕидот. 31 00:01:25,570 --> 00:01:29,560 Потоа, конечно, ќе се намали на стожерот право на тој ѕид да го стави меѓу 32 00:01:29,560 --> 00:01:32,970 сите броеви помали од тоа и сите броеви поголеми. 33 00:01:32,970 --> 00:01:34,460 >> Па ајде направите тоа. 34 00:01:34,460 --> 00:01:38,540 Ги собереш на 2, се стави на ѕидот на на почетокот, и повик на 6 "тековната 35 00:01:38,540 --> 00:01:41,590 елемент. "Значи, ние сакаме да се погледне нашите сегашни елемент, 6. 36 00:01:41,590 --> 00:01:44,200 И бидејќи е поголем од 2, ние да го оставиме таму на 37 00:01:44,200 --> 00:01:45,610 правото на ѕидот. 38 00:01:45,610 --> 00:01:48,980 Тогаш, ние се движат да се погледне на 5 како наш тековниот елемент и да види дека оваа 39 00:01:48,980 --> 00:01:51,840 е, пак, поголеми од стожерот, па ние оставете го таму каде што е на десната 40 00:01:51,840 --> 00:01:53,190 страна на ѕидот. 41 00:01:53,190 --> 00:01:53,880 Ние се движат натаму. 42 00:01:53,880 --> 00:01:56,750 Нашата актуелна елемент е сега 1, и - ох. 43 00:01:56,750 --> 00:01:58,030 Ова е различно сега. 44 00:01:58,030 --> 00:02:00,890 Тековниот елемент е сега помал од стожерот, затоа сакаме да го стави 45 00:02:00,890 --> 00:02:02,570 од лево на ѕидот. 46 00:02:02,570 --> 00:02:06,555 Да го направите ова, ајде да се префрлат на тековниот елемент со најниска индекс 47 00:02:06,555 --> 00:02:07,970 седи само на правото на ѕидот. 48 00:02:07,970 --> 00:02:14,050 49 00:02:14,050 --> 00:02:17,570 Сега, ние се движат на ѕидот до еден индекс па 1 се наоѓа на левата 50 00:02:17,570 --> 00:02:19,750 страна на ѕидот сега. 51 00:02:19,750 --> 00:02:20,310 >> Чекаат. 52 00:02:20,310 --> 00:02:23,450 Јас само измешани елементи на десната страна на ѕидот, не јас? 53 00:02:23,450 --> 00:02:23,890 Не грижете се. 54 00:02:23,890 --> 00:02:24,930 Тоа е во ред. 55 00:02:24,930 --> 00:02:27,570 Единственото нешто што се грижат за сега за сега е дека сите овие елементи на 56 00:02:27,570 --> 00:02:29,570 правото на ѕидот се поголеми од стожерот. 57 00:02:29,570 --> 00:02:31,760 Не постојат вистински цел уште се претпоставува. 58 00:02:31,760 --> 00:02:33,200 >> Сега, назад на сортирање. 59 00:02:33,200 --> 00:02:35,840 Па ние продолжи да гледа во остатокот од елементи. 60 00:02:35,840 --> 00:02:39,075 И во овој случај, можеме да видиме дека постојат нема други елементи помалку од 61 00:02:39,075 --> 00:02:42,100 стожерот, па сите ние ги остават на на десната страна на ѕидот. 62 00:02:42,100 --> 00:02:45,980 Конечно, ние се дојде до тековниот елемент и види дека тоа е стожерот. 63 00:02:45,980 --> 00:02:48,830 Сега, тоа значи дека имаме две делови од низа, првиот суштество 64 00:02:48,830 --> 00:02:51,820 мали на стожерот и на левата страна на ѕидот, а втората е 65 00:02:51,820 --> 00:02:54,500 поголема од стожерот на десно на ѕидот. 66 00:02:54,500 --> 00:02:57,040 Ние сакаме да се стави на стожерот елемент помеѓу две, а потоа ќе знаеме 67 00:02:57,040 --> 00:03:01,000 дека стожерот е во право конечна сортирани место. 68 00:03:01,000 --> 00:03:04,980 Па ние се префрлат на првиот елемент на десно на ѕидот со стожерот, 69 00:03:04,980 --> 00:03:06,410 и знаеме стожерот на во својата право позиција. 70 00:03:06,410 --> 00:03:11,130 71 00:03:11,130 --> 00:03:15,650 >> Тогаш ние го повторите овој процес за subarrays лево и десно на стожерот. 72 00:03:15,650 --> 00:03:18,700 Од последните subarray е само еден елемент долго, ние знаеме дека е веќе 73 00:03:18,700 --> 00:03:22,480 сортирани бидејќи како може да биде надвор од нарачате ако сте само еден елемент? 74 00:03:22,480 --> 00:03:28,860 За десната страна на subarray, ние види дека стожерот е 5, и ѕидот 75 00:03:28,860 --> 00:03:32,250 е само лево од 6. 76 00:03:32,250 --> 00:03:34,970 И тековниот елемент, исто така, започнува како 6. 77 00:03:34,970 --> 00:03:36,200 Така 6 е поголема од 5. 78 00:03:36,200 --> 00:03:38,590 Ние го оставиме тоа каде што е на десно на ѕидот. 79 00:03:38,590 --> 00:03:41,060 Сега, да се пресели на, 3 е помал од 5. 80 00:03:41,060 --> 00:03:44,160 Па ние го префрлат со првиот елемент само правото на ѕидот. 81 00:03:44,160 --> 00:03:47,944 82 00:03:47,944 --> 00:03:50,750 Сега, јас се пресели на ѕидот до една. 83 00:03:50,750 --> 00:03:53,010 Сега, да се пресели на 8. 84 00:03:53,010 --> 00:03:56,480 8 е поголема од 5, и така ние го оставиме тоа. 85 00:03:56,480 --> 00:03:58,720 4 е помал од 5, па ние го вклучите. 86 00:03:58,720 --> 00:04:02,950 87 00:04:02,950 --> 00:04:03,570 И натаму. 88 00:04:03,570 --> 00:04:04,820 И натаму. 89 00:04:04,820 --> 00:04:10,190 90 00:04:10,190 --> 00:04:13,670 >> Секој пат кога ние го повторуваме процесот на левата и десната страна на низата. ние 91 00:04:13,670 --> 00:04:17,010 изберете стожерот и прават споредби и да се создаде едно друго ниво на лево и 92 00:04:17,010 --> 00:04:18,240 право subarrays. 93 00:04:18,240 --> 00:04:21,500 Овој рекурзивен повик ќе продолжи се додека стигнавме до крајот кога ние сме 94 00:04:21,500 --> 00:04:25,290 поделена на целокупниот спектар на само subarrays должина 1. 95 00:04:25,290 --> 00:04:28,060 Од таму, ние знаеме низата е сортирана затоа што секој елемент има, 96 00:04:28,060 --> 00:04:29,330 одреден момент, е стожерот. 97 00:04:29,330 --> 00:04:32,720 Со други зборови, за секој елемент, сите на бројки на лево се помалку 98 00:04:32,720 --> 00:04:36,420 вредности и сите броеви на право да имаат поголема вредност. 99 00:04:36,420 --> 00:04:38,980 >> Овој метод работи многу добро ако вредноста на стожерот избран е 100 00:04:38,980 --> 00:04:41,930 приближно во средината опсег на листата вредности. 101 00:04:41,930 --> 00:04:45,630 Ова би значело дека, откако ќе се движат елементи наоколу, има за онолку 102 00:04:45,630 --> 00:04:48,390 елементи од лево на стожерот како што постојат кон десно. 103 00:04:48,390 --> 00:04:52,380 И поделбата-и-ја освои природата на Quicksort алгоритам потоа се земени 104 00:04:52,380 --> 00:04:53,850 целосно искористување на. 105 00:04:53,850 --> 00:04:57,500 Ова создава траење на О (n најавите n,) на n, бидејќи ние треба да се направи N минус 1 106 00:04:57,500 --> 00:05:01,640 споредби на секоја генерација и да се најавите n бидејќи ние треба да се подели на листата 107 00:05:01,640 --> 00:05:03,210 логирате n пати. 108 00:05:03,210 --> 00:05:06,160 Меѓутоа, во најлош случај, овој алгоритам всушност може да биде О (n 109 00:05:06,160 --> 00:05:09,850 квадрат.) Да претпоставиме дека на секоја генерација, стожерот само така се случува да биде 110 00:05:09,850 --> 00:05:12,520 Најмалата или најголемиот од броеви ние сме сортирање. 111 00:05:12,520 --> 00:05:15,870 Ова би значело рушење на листа n пати и одлуки n минус 1 112 00:05:15,870 --> 00:05:17,690 споредби секој време. 113 00:05:17,690 --> 00:05:20,490 Така, о н квадрат. 114 00:05:20,490 --> 00:05:22,000 >> Како можеме да се подобри начинот? 115 00:05:22,000 --> 00:05:25,100 Еден добар начин да се подобри начинот е да се намали веројатноста дека 116 00:05:25,100 --> 00:05:28,150 траење некогаш всушност o од n квадрат. 117 00:05:28,150 --> 00:05:31,860 Се сеќавам ова најлош случај, најлошото сценарио само може да се случи кога 118 00:05:31,860 --> 00:05:35,320 стожерот избрана е секогаш на највисоко или најниската вредност во низа. 119 00:05:35,320 --> 00:05:38,630 Да се ​​обезбеди тоа е помалку веројатно да се случи, можеме да најдеме стожерот од 120 00:05:38,630 --> 00:05:42,610 изборот на повеќе елементи и земајќи средна вредност. 121 00:05:42,610 --> 00:05:44,650 >> Моето име е Марк Grozen-Смит, и ова е CS50. 122 00:05:44,650 --> 00:05:47,790 123 00:05:47,790 --> 00:05:50,930 >> За едноставност, да претпоставиме дека оние работи се само цели броеви, но 124 00:05:50,930 --> 00:05:51,970 знаете дека Quicksert - 125 00:05:51,970 --> 00:05:53,160 Quicksert? 126 00:05:53,160 --> 00:05:55,200 Жал. 127 00:05:55,200 --> 00:06:02,000 >> Тука имаме цели броеви 6, 5, 1, 3, 8, 4, 9. 128 00:06:02,000 --> 00:06:03,200 >> ЗВУЧНИК 1: Навистина? 129 00:06:03,200 --> 00:06:04,850 >> ЗВУЧНИК 2: Не завршуваат тука. 130 00:06:04,850 --> 00:06:06,100 >> ЗВУЧНИК 1: Навистина? 131 00:06:06,100 --> 00:06:08,491