Објашњено брзо сортирање у Јави

Quick Sort Java Explained



Брзо сортирање, такође написано као Куицксорт, је шема за сортирање листа која користи парадигму подели-па-освоји. Постоје различите шеме за брзо сортирање, а све користе парадигму завади па владај. Пре него што објасни Брзо сортирање, читалац мора знати конвенцију о преполовљавању листе или подлисте и медијану три вредности.

Халвинг Цонвентион

Када је број елемената на листи паран, преполовљавање листе значи да је дословна прва половина листе прва половина, а дословна друга половина листе друга половина. Средњи (средњи) елемент целе листе је последњи елемент прве листе. То значи да је средњи индекс дужина / 2 - 1, јер бројање индекса почиње од нуле. Дужина је број елемената на листи. На пример, ако је број елемената 8, онда прва половина листе има 4 елемента, а друга половина листе такође има 4 елемента. То је у реду. Пошто бројање индекса почиње од 0, средњи индекс је 3 = 8 /2 - 1.







Шта је са случајем, када је број елемената на листи или под-листи непаран? На почетку, дужина се и даље дели са 2. По договору, број елемената у првој половини ове поделе је дужина / 2 + 1/2. Бројање индекса почиње од нуле. Средњи индекс је дат дужином / 2 - 1/2. То се конвенцијом сматра средњим роком. На пример, ако је број елемената на листи 5, онда је средњи индекс 2 = 5/2 - 1/2. Постоје три елемента у првој половини листе и два елемента у другој половини. Средњи елемент целе листе је трећи елемент на индексу 2, што је средњи индекс јер бројање индекса почиње од 0.



Подела на овај начин је пример целобројне аритметике.



Медијана три вредности

Питање: Која је медијана низа:





Ц Б А

Решење:
Распоредите листу у растућем редоследу:



А Б Ц

Средњи члан, Б, је медијана. То је величина која се налази између друге две величине.

Тражење медијане на листи није таква врста. На пример, на листи од 19 неразврстаних елемената може бити потребна медијана за први, средњи и последњи елемент. Ове три вредности можда нису у растућем редоследу; па се њихови индекси морају узети у обзир.

Уз Брзо сортирање потребна је медијана за целу листу и под-листе. Псеудокод за тражење медијане три вредности размакнуте у листи (низу) је:

мид: =(ниска+високо) / 2
акоарр[мид] <арр[ниска]
свап дол[ниска]са дол[мид]
акоарр[високо] <арр[ниска]
свап дол[ниска]са дол[високо]
акоарр[мид] <арр[високо]
свап дол[мид]са дол[високо]
пивот: =арр[високо]

Израз арр значи низ. Овај сегмент кода тражи медијану и такође врши сортирање. Овај сегмент кода изгледа једноставно, али може бити прилично збуњујуће. Дакле, обратите пажњу на следеће објашњење:

Сортирање у овом водичу ће произвести листу у којој је прва вредност најмања вредност, а последња највећа вредност. Код абецеде, А је мање од З.

Овде је заокрет резултујућа медијана. Низак је најнижи индекс листе или подлисте (не мора нужно бити најнижа вриједност); висок је највиши индекс листе или подлисте (не нужно за највећу вредност), а средњи је конвенционални средњи индекс (не нужно за средњу вредност целе листе).

Дакле, медијана коју треба добити је између вредности најнижег индекса, вредности средњег индекса и вредности највишег индекса.

У коду се прво добија конвенционални средњи индекс. На овом почетку листа није сортирана. Поређење и неко преуређивање у растућем редоследу три вредности ће се десити истовремено. Прва наредба иф упоређује вредност најнижег индекса и вредности средњег индекса. Ако је вредност средњег индекса мања од вредности најнижег индекса, две вредности мењају позиције. Ово почиње сортирање и мења распоред вредности на листи или под-листи. Друга наредба иф упоређује вредност највишег индекса и вредности најнижег индекса. Ако је индекс највишег индекса мањи од оног најнижег индекса, две вредности мењају позиције. Ово наставља са одређеним сортирањем и променом распореда вредности на листи или под-листи. Трећи иф-исказ упоређује вредност средњег индекса и вредности највишег индекса. Ако је индекс највишег индекса мањи од средњег индекса, две вредности мењају позиције. Овде се такође може догодити неко сортирање или преуређивање. Овај трећи иф-услов није као претходна два.

На крају ове три замене, средња вредност три вредности о којима је реч била би А [висока], чији би се изворни садржај могао променити у сегменту кода. На пример, размотрите неразврстани низ:

Ц Б А

Већ знамо да је медијана Б. Међутим, то треба доказати. Овде је циљ да се добије медијана ове три вредности помоћу горњег сегмента кода. Први иф-исказ упоређује Б и Ц. Ако је Б мање од Ц, онда се позиције Б и Ц морају заменити. Б је мање од Ц, па нови распоред постаје:

Б Ц А

Приметите, вредности за најнижи индекс и средњи индекс су се промениле. Друга наредба иф упоређује А и Б. Ако је А мање од Б, онда се позиције А и Б морају замијенити. А је мање од Б, па нови распоред постаје:

А Ц Б.

Приметите, вредности за највећи индекс и најнижи индекс су се промениле. Трећи иф-исказ упоређује Ц и Б. Ако је Ц мањи од Б, онда се позиције Ц и Б морају заменити. Ц није мањи од Б, тако да се не врши замена. Нови аранжман остаје као претходни, то јест:

А Ц Б.

Б је медијана, која је, А [висока], и то је стожер. Дакле, заокрет се рађа на крајњем крају листе или под-листе.

Функција замене

Још једна функција потребна за брзо сортирање је функција замене. Функција замене, размењује вредности две променљиве. Псеудокод за функцију замене је:

дефинисати свап(Икс,и)
темп: =Икс
Икс: =и
и: =темп

Овде се к и и односе на стварне вредности, а не на копије.

Сортирање у овом чланку ће произвести листу у којој је прва вредност најмања вредност, а последња највећа вредност.

Садржај чланка

Алгоритам за брзо сортирање

Уобичајен начин сортирања неразврстане листе је разматрање прве две вредности. Ако нису у реду, доведите их у ред. Затим размотрите прве три вредности. Скенирајте прва два да видите где се трећа вредност уклапа и поставите га на одговарајући начин. Затим размотрите прве четири вредности. Скенирајте прве три вредности да видите где се четврта вредност уклапа и на одговарајући начин је уклопите. Наставите са овом процедуром док се цела листа не сортира.

Ова процедура, позната и као груба сила, у говору рачунарског програмирања је сувише спора. Алгоритам брзог сортирања долази са много бржом процедуром.

Кораци за алгоритам за брзо сортирање су следећи:

  1. Уверите се да постоје најмање 2 броја за сортирање на неразврстаној листи.
  2. Набавите процењену централну вредност за листу, која се назива пивот. Медијана, како је горе описано, један је од начина да се добије заокрет. Различити начини долазе са својим предностима и манама. - Видимо се касније.
  3. Поделите листу на партиције. То значи да поставите заокрет на листу. На такав начин, сви елементи са леве стране су мањи од вредности заокрета, а сви елементи са десне стране су већи или једнаки вредности заокретања. Постоје различити начини поделе. Свака метода партиције има своје предности и недостатке. Подела је подела у парадигми завади па владај.
  4. Понављајте кораке 1, 2 и 3 рекурзивно за нове парове подлистака који се појављују све док се цела листа не сортира. Ово осваја у парадигми завади па владај.

Псеудокод за брзо сортирање је:

алгоритам за брзо сортирање(арр,ниска,високо)је
акониска<високо онда
пивот(ниска,високо)
п: =подела(арр,ниска,високо)
брзо сортирање(арр,ниска,п- 1)
брзо сортирање(арр,п+ 1,високо)

Псеудокод партиције

Псеудокод партиције који се користи у овом водичу је:

партиција алгоритма(арр,ниска,високо)је
пивот: =арр[високо]
и: =ниска
ј: =високо
урадити
урадити
++и
док(арр[и] <пивот)
урадити
-ј
док(арр[ј] >пивот)
ако (и<ј)
свап дол[и]са дол[ј]
док(и<ј)
свап дол[и]са дол[високо]
повратаки

На доњој илустрацији брзог сортирања користи се овај код:

Илустрација брзог сортирања

Размотрите следећу неразврстану листу (низ) абецедних слова:

К В Е Р Т И У И О П

Прегледом је сортирана листа:

Е И О П К Р Т У В И

Сортирана листа ће се сада доказати, коришћењем горњег алгоритма и сегмената псеудокода, са несортиране листе:

К В Е Р Т И У И О П

Први заокрет је одређен из арр [0] = К, арр [4] = Т и арр [9] = П, и идентификован је као К и постављен је крајње десно на листи. Дакле, листа са било којим сортирањем заокретних функција постаје:

П В Е Р Т И У И О П

Тренутни заокрет је К. Поступак заокрета је извео мало сортирање и ставио П на прву позицију. Резултујућа листа мора бити преуређена (партиционисана), тако да су сви елементи са леве стране мање вредности, онда су заокрет и сви елементи десно од заокрета једнаки или већи од заокрета. Рачунар не може извршити партиционисање прегледом. Дакле, ради помоћу индекса и горњег алгоритма партиције.

Нижи и високи индекси сада су 0 и 9. Дакле, рачунар ће почети скенирањем од индекса 0 све док не достигне индекс, чија је вредност једнака или већа од заокрета и привремено се ту зауставља. Такође ће скенирати са високог (десног) краја, индекса 9, који се спушта, све док не достигне индекс чија је вредност мања или једнака заокрету и привремено се ту заустави. То значи две зауставне позиције. Ако и, инкрементална променљива индекса, од ниске још није једнака или већа од опадајуће променљиве индекса, ј од високе, тада се ове две вредности мењају. У тренутној ситуацији, скенирање са оба краја је заустављено на В и О. Дакле, листа постаје:

П О Е Р Т И У И В К

Заокрет је и даље К. Скенирање у супротним смеровима се наставља и зауставља у складу с тим. Ако и још увек није једнако или веће од ј, тада се мењају две вредности при којима је скенирање са оба краја заустављено. Овај пут, скенирање са оба краја зауставило се на Р и И. Дакле, распоред листе постаје:

П О Е И Т И У Р В К

Заокрет је и даље К. Скенирање у супротним смеровима се наставља и зауставља у складу с тим. Ако и још није једнак или већи од ј, тада се две вредности на којима је скенирање престало замењују. Овај пут, скенирање са оба краја је заустављено на Т за и и за ј. и и ј су се срели или прешли. Дакле, не може доћи до замене. Листа остаје иста као:

П О Е И Т И У Р В К

У овом тренутку, стожер, К, мора бити постављен на крајњи положај приликом сортирања. Ово се постиже заменом арр [и] са арр [високо], заменом Т и К. Листа постаје:

П О Е И К И У Р В Т

У овом тренутку, подела за целу листу је завршена. Пивот = К је одиграо своју улогу. Сада постоје три под-листе, а то су:

П О Е И К И У Р В Т

Подела је подела и освајање (сортирање) у парадигми. К је на свом исправном месту за сортирање. Сваки елемент лево од К мањи је од К, а сваки елемент десно од К је већи од К. Међутим, лева листа још увек није сортирана; а десна листа још увек није сређена. Цела функција брзог сортирања мора да се позове рекурзивно да би се сортирала лева и десна под-листа. Ово подсећање на Брзо сортирање мора да се настави; нове под-листе ће се развијати све док се цела оригинална листа потпуно не сортира. За свако позивање функције брзог сортирања, лева под-листа се прво прегледа пре него што се приступи одговарајућој десној под-листи. За сваку под-листу мора се добити нови заокрет.

За под-листу:

П О Е И

Одређен је заокрет (медијана) за П, О и И. Заокрет би био О. За ову под-листу, а која се односи на комплетну листу, нови арр [ниско] је арр [0], а нови арр [високо] је последњи арр [и-1] = арр [ 4-1] = арр [3], где је и коначни пивот индекс из претходне партиције. Након што је позвана функција пивот (), нова вредност заокрета, пивот = О. Немојте да правите забуну између функције заокрета и вредности заокрета. Заокретна функција може извршити мало сортирање и поставити заокрет крајње десно на под-листи. Ова под-листа постаје,

И П Е О

Са овом шемом, заокрет се увек завршава на десном крају под-листе или листе након позива функције. Скенирање са оба краја почиње од арр [0] и арр [3] док се и и ј не сусретну или укрсте. Поређење се врши помоћу пивот = О. Прва стајалишта су на тачкама П и Е. Замењују се, а нова под-листа постаје:

И Е П О

Скенирање са оба краја се наставља, а нова стајалишта су на П за и и на Е за ј. Сада смо се ја и ј срели или укрстили. Дакле, под-листа остаје иста као:

И Е П О

Подела под-листе или листе завршава се када се заокрет постави на крајњи положај. Дакле, нове вредности за арр [и] и арр [хигх] се мењају. То јест, П и О се мењају. Нова под-листа постаје:

И Е О П

О је сада на коначној позицији за целу листу. Његова улога стожерне тачке је окончана. Под-листа је тренутно подељена на још три листе, а то су:

И Е О П

У овом тренутку мора се позвати Куицк Сорт прве десне под-листе. Међутим, неће се звати. Уместо тога, биће забележено и резервисано, што ће се касније назвати. Како се изводе изрази функције партиционисања, са врха функције, сада се мора позвати Брзо сортирање за леву под-листу (након што је позван пивот ()). Биће позван на листу:

И Е

Почеће тражењем медијана И и Е. Овде је арр [ниско] = И, арр [средњи] = И и арр [високо] = Е. Дакле, медијану, заокрет, треба одредити алгоритмом заокрета као , И. Међутим, горњи заокретни псеудокод ће одредити заокрет као Е. Ова грешка се јавља овде јер је горњи псеудокод намењен за три елемента, а не за два. У доњој имплементацији постоји одређено прилагођавање кода. Под-листа постаје,

Е И

Заокрет се увек завршава на десном крају под-листе или листе након позива функције. Скенирање са оба краја почиње искључиво од арр [0] и арр [1] све док се и и ј не сретну или укрсте. Поређење се врши са пивот = И. Прва и једина заустављања су на И и Е: на И за и и на Е за ј. Сада смо се ја и ј срели или прешли. Дакле, под-листа остаје иста као:

Е И

Подела под-листе или листе завршава се када се заокрет постави на крајњи положај. Дакле, нове вредности за арр [и] и арр [хигх] се мењају. Овде се дешава да је арр [и] = И и арр [високо] = И. Дакле, иста вредност је замењена сама са собом. Нова под-листа постаје:

Е И

Сада сам на коначној позицији за целу листу. Његова улога стожерне тачке је окончана. Под-листа је сада подељена на још две листе, а то су:

Е И

Сада су заокрети до сада били К, О и И. Пивоти се завршавају на својим коначним позицијама. Под-листа појединачних елемената, као што је горњи П, такође завршава на својој коначној позицији.

У овом тренутку прва лева под-листа је потпуно сређена. А поступак сортирања је сада на:

Е И О П К И У Р В Т

Прва десна под-листа:

И У Р В Т

још треба сортирати.

Освајање прве десне под-листе
Упамтите да је позив за брзо сортирање за прву десну под-листу забележен и резервисан уместо извршења. У овом тренутку ће се извршити. И тако, нови арр [лов] = арр [5] = арр [КПивотИндек+1], а нови арр [хигх] остаје арр [9]. Сличан скуп активности који се догодио за прву леву под-листу десиће се овде. И ова прва десна под-листа је сортирана на:

Р Т У В И

Оригинална несортирана листа је сортирана на:

Е И О П К Р Т У В И

Јава кодирање

Стављање алгоритма у Јаву је само стављање свих горе наведених сегмената псеудокода у Јава методе у једну класу. Не заборавите да у класи мора постојати маин () метода која ће позвати функцију куицксорт () са несортираним низом.

Метод пивот ()

Јава пивот () метода која враћа вредност, пивот, треба да буде:

празнинапивот(цхарарр[], интниска, интвисоко) {
интмид= (ниска+високо) / 2;
ако (арр[мид] <арр[ниска])
свап(арр,ниска,мид);
ако (арр[високо] <арр[ниска])
свап(арр,ниска,високо);
ако ((високо-ниска) > 2) {
ако (арр[мид] <арр[високо])
свап(арр,мид,високо);
}
}

Метод свап ()

Метод свап () треба да буде:

празнинасвап(цхарарр[], интИкс, инти) {
цхартемп=арр[Икс];
арр[Икс] =арр[и];
арр[и] =темп;
}

Метод куицксорт ()

Метода куицксорт () треба да буде:

празнинабрзо сортирање(цхарарр[], интниска, интвисоко) {
ако (ниска<високо) {
пивот(арр,ниска,високо);
интп=подела(арр,ниска,високо);
брзо сортирање(арр,ниска,п- 1);
брзо сортирање(арр,п+ 1,високо);
}
}

Метод партиције ()

Метод партитион () треба да буде:

интподела(цхарарр[], интниска, интвисоко) {
цхарпивот=арр[високо];
инти=ниска;
интј=високо;
урадити {
урадити
++и;
док(арр[и] <пивот);
урадити
-ј;
док(арр[ј] >пивот);
ако (и<ј)
свап(арр,и,ј);
}док(и<ј);
свап(арр,и,високо);
повратаки;
}

Главни () метод

Главни () метод може бити:

јавностистатичан празнинаглавни(Низ[]аргс) {
цхарарр[] = {'К', 'ИН', 'И', 'Р', 'Т', 'И', 'У', 'Ја', 'ИЛИ', 'П'};
ТхеЦласс КуицкСорт= НоваКласа();
КуицкСорт.брзо сортирање(арр, 0, 9);
Систем.оут.принтлн(„Разврстани елементи:“);
за(инти=0;и<10;и++) {
Систем.оут.принт(арр[и]);Систем.оут.принт('');
}
Систем.оут.принтлн();
}

Све горе наведене методе могу се сврстати у једну класу.

Закључак

Брзо сортирање је алгоритам за сортирање који користи парадигму завади па владај. Започиње дељењем неразврстане листе на две или три под-листе. У овом водичу Куицк Сорт је поделио листу на три под-листе: леву под-листу, средњу листу једног елемента и десну под-листу. Освајање у Куицк Сорт-у је дељење листе или под-листе док их сортирате, користећи заокретну вредност. Овај водич је објаснио једну имплементацију брзог сортирања у Јава рачунарском језику.

О аутору

Цхрисантхус Форцха

Откривач математичке интеграције из Првих принципа и сродних серија. Магистрирао техничко образовање, специјализован за електронику и рачунарски софтвер. БСц Елецтроницс. Такође имам знање и искуство на мастер студијама из рачунарства и телекомуникација. Од 20.000 писаца, био сам 37. најбољи писац на девартицлес.цом. На овим пољима радим више од 10 година.

Прикажи све постове

ПОВЕЗАНИ ЛИНУКС САВЕТНИ ПОСТОВИ