[Powered by Google Translate] [Вметнување Сортирај]
[Томи MacWilliam] [Универзитетот Харвард]
[Ова е CS50.TV]
Ајде да ги разгледаме во вметнување вид, алгоритам за преземање на листа со броеви и сортирање на нив.
Алгоритам, се сеќавам, е само чекор-по-чекор процедурата за остварување на задачата.
Основната идеја зад вметнување вид, е да се подели нашата листа во два дела,
сортирани дел и несортиран дел.
>> На секој чекор од алгоритмот, голем број се движи
од несортиран дел на подредени дел
до крајот на целата листа е сортирана.
Еве е листата на шест несортиран броеви - 23, 42, 4, 16, 8, и 15.
Од овие бројки не се сите во ред, тие се вон едиции.
Бидејќи ние не се започнати сортирање сепак, ние ќе ги разгледа сите шест елементи нашите несортиран дел.
>> Откако ќе почнат сортирање, ние ќе се стават овие подредени броеви лево од овие.
Значи, ајде да почнеме со 23, првиот елемент во нашата листа.
Ние немаме елементи во нашата подредени дел, сепак,
па ајде едноставно сметаат 23 да биде на почетокот и крајот на нашата подредени дел.
Сега, нашите подредени дел има еден број, 23,
и нашите несортиран дел има овие пет броеви.
Ајде сега вметнете следниот број во нашата несортиран дел, 42, во решат дел.
>> Да го стори тоа, ќе треба да се споредат 42 до 23 - единствениот елемент во нашата подредени дел досега.
Четириесет и двајца е поголем од 23, па ние едноставно може да додадете 42 до крајот
на подредени дел од листата. Одлично!
Сега нашите подредени дел има два елементи, и нашите несортиран дел има четири елементи.
Значи, ајде сега се движи до 4, следниот елемент во несортиран дел.
Значи, каде што ова треба да се стави во решат дел?
>> Запомнете, ние сакаме да го поставите на овој број во подредени цел
така и нашата подредени дел останува правилно подредени на сите времиња.
Ако ние место на 4 до правото на 42, тогаш нашата листа ќе биде надвор од употреба.
Значи, ајде да продолжи движат од десно на лево во нашиот вид дел.
Како што се движиме, да ја префрлат секој број од местото да се направи простор за нов број.
Океј, 4 е исто така помалку од 23, па не можеме да го поставите тука или.
Ајде да се движи од 23 право едно место.
>> Тоа значи дека ние би сакале да се одржи на 4 во првиот слот во решат дел.
Забележи како овој простор во листата веќе беше празен,
затоа што ние сме се движат подредени елементи надолу како што ние си ги сретнал.
Во ред. Значи, ние сме на половина пат таму.
Ајде да продолжиме со нашите алгоритам со вметнување на 16 во решат дел.
Шеснаесет е помалку од 42, па ајде префрлат 42 десно.
Шеснаесет исто така е помалку од 23, па ајде, исто така, се префрлат тој елемент.
>> Сега, 16 е поголем од 4. Значи, тоа изгледа како ние би сакале да го вметнете 16 помеѓу 4 и 23.
Додека се движат низ подредени дел од листата од десно кон лево,
4 е првиот број видовме дека е помал од бројот
ние се обидуваме да го внесете.
Значи, сега можеме да го вметнете 16 во овој празен слот,
кои, се сеќавам, ние сме создадени од подвижни елементи во вид дел над
како што ние си ги сретнал.
>> Во ред. Сега, имаме четири подредени елементи и два несортиран елементи.
Значи, ајде да се движат од 8 во решат дел.
Осум е помалку од 42.
Осум е помалку од 23.
И 8 е помалку од 16.
Но 8 е поголем од 4.
Значи, ние би сакале да го вметнете 8 помеѓу 4 и 16.
И сега ние само треба уште еден елемент остави да се најде - на 15.
Петнаесет е помалку од 42,
Петнаесет е помалку од 23.
И 15 е помал од 16.
Но 15 е поголема од 8.
>> Значи, тука е местото каде што сакаме да ја направиме нашата конечна вметнување.
И ние ќе завршиш.
Ние немаме повеќе елементи во несортиран дел,
и нашите подредени дел е во правилен ред.
Броевите се нарача од најмалите до најголемите.
Значи, ајде да ги разгледаме во некои pseudocode кој го опишува чекори ние само ги извршуваат.
>> На алинеја 1, можеме да видиме дека ние ќе треба да iterate во текот секој елемент во листата
освен првата, уште од првиот елемент во несортиран дел едноставно ќе стане
првиот елемент во решат дел.
На алинеи 2 и 3, ние сме следење на нашите сегашни место во несортиран дел.
Елемент претставува бројот ние сме во моментов се движат во решат дел,
и ѕ претставува нашиот индекс во несортиран дел.
>> On-line 4, ние сме процесирањето преку подредени дел од десно кон лево.
Ние сакаме да се запре процесирањето откако елемент од лево на нашите сегашни позиција
е помал од елементот ние се обидуваме да го внесете.
На линија 5, ние сме менувањето на секој елемент се сретнуваме еден простор на десно.
На тој начин, ќе имаат јасна простор да го вметнете во кога ќе се најде првиот елемент
помалку од елементот ние сме се движат.
На алинеја 6, ние сме ажурирање на нашите контра да продолжи да се движи лево преку подредени дел.
Конечно, на линијата 7, ние сме вметнување на елементи во решат дел од листата.
>> Ние знаеме дека тоа е во ред да се вметне во позиција ѕ,
бидејќи ние веќе се пресели на елемент што се користи да биде таму еден простор на десно.
Запомни, ние сме се движат низ подредени дел од десно кон лево,
но ние сме се движат низ несортиран дел од лево кон десно.
Во ред. Ајде сега да ги разгледаме во тоа колку долго трчање дека алгоритам зеде.
Ние прво ќе се постави прашањето колку долго е потребно за овој алгоритам да се кандидира во најлош случај.
Потсетиме дека ние ги претставуваме оваа трчање време со Биг О нотација.
Со цел да се најде нашата листа, моравме да iterate во текот на елементи во несортиран дел,
и за секој од овие елементи, потенцијално над сите елементи во решат дел.
Интуитивно, ова звучи како О (n ^ 2) операција.
>> Гледајќи нашата pseudocode, имаме јамка вгнездени внатре во јамка,
кои, навистина, звучи како О (n ^ 2) операција.
Сепак, подредени дел од листата не содржат целата листа до самиот крај.
Сепак, ние потенцијално би можеле да внесете нов елемент на самиот почеток на подредени дел
на секој повторување на алгоритам,
што значи дека ние ќе треба да се погледне во секој елемент моментално во решат дел.
Значи, тоа значи дека ние потенцијално би можеле да направат една споредба за вториот елемент,
две споредби за третиот елемент, и така натаму.
Така, вкупниот број на чекори е збир на броеви од 1 до должината на листата минус 1.
Ние може да претставуваат со збир.
>> Ние не ќе одат во summations тука, но излегува дека овој збир е еднаков на
n (n - 1) над 2, што е еквивалентно n ^ 2/2 - n / 2.
Кога зборуваме за асимптотска траење,
овој n ^ 2 рок ќе доминираат овој n рок.
Значи, вметнување вид е Биг О (n ^ 2).
Што ако ние трчаше вметнување вид на веќе сортирана листа.
Во тој случај, ние едноставно ќе се изгради на подредени дел од лево кон десно.
Значи, ние само ќе треба на цел од n чекори.
>> Тоа значи дека вметнување вид има најдобар случај перформанси на n,
кои ние ги претставуваме со Ω (л).
И тоа е тоа за вметнување вид,
само еден од многуте алгоритми може да се користат да се најде на листата.
Моето име е Томи, и ова е CS50.
[CS50.TV]
О, вие едноставно не може да го запре дека откако ќе почне.
О, ние го сторивме тоа - >> бум!