Njia za kupanga data katika programu. Mbinu za kupanga safu. Tabia za kulinganisha za njia za kupanga

NJIA ZA KUPANGA

Wakati wa maendeleo programu Operesheni ya kawaida sana ni kupanga maadili, i.e. kupanga orodha ya vipengele kwa mpangilio fulani (kwa mfano, maneno kwa mpangilio wa alfabeti au nambari kwa mpangilio wa kupanda au kushuka).

Kuna algorithms nyingi za kupanga vipengele. Rahisi kati yao ni njia ya "Bubble". Algorithm inatekelezwa kwa namna ya vitanzi viwili vya kiota. Katika kitanzi cha ndani, vipengele vyote vya safu vinatazamwa kwa utaratibu, vipengele vya karibu vinalinganishwa kwa jozi, na ikiwa ya pili ni kubwa kuliko ya kwanza (wakati wa kupanga kwa utaratibu wa kushuka), vipengele vinabadilishwa. Kigezo cha kitanzi cha ndani ni index (nambari) ya kipengele cha safu. Kwa aina kamili, ruhusa kama hiyo lazima ifanyike mara n-1, ambapo n ni idadi ya vipengele katika safu. Kwa kufanya hivyo, kitanzi cha nje kinapangwa, parameter ambayo ni hatua ya kuchagua.

Mfano. Panga vipengee vya safu ya nambari moja ya nambari kamili kwa mpangilio wa kupanda.

Kielelezo 1 kinaonyesha mlolongo wa upangaji upya wa vipengele.

Kielelezo 1. Upangaji wa Bubble

Ingawa katika mfano uliopendekezwa upangaji ulikamilishwa kwa hatua nne, kuangalia vitu kutaendelea kwa marudio mawili zaidi, kwa sababu. jumla ya idadi ya marudio ni moja chini ya saizi ya safu.

Kielelezo cha 2 kinaonyesha mchoro wa kuzuia wa algorithm inayozingatiwa.

Kielelezo 2. Chati ya mtiririko ya algorithm ya kupanga viputo

Tofauti ya m inaletwa ili kuruhusu ubadilishanaji wa maadili kati ya vigezo viwili, k inawajibika kwa hatua za kupanga.

Programu ya C++ inayotumia algorithm hii itaonekana kama hii.


Mchoro 3. Mpango wa kupanga vipengele vya safu kwa kutumia njia ya "Bubble".

Kupanga viputo ni njia isiyofaa kutokana na idadi kubwa kulinganisha.

Njia ya uteuzi wa moja kwa moja inafaa zaidi

Hatua ya kwanza inajumuisha kutazama kwa mpangilio orodha nzima ya maadili na kuchagua kiwango cha chini au cha juu kutoka kwake (kulingana na mpangilio wa kupanga), kisha kuiweka katika nafasi ya kwanza kwa kuibadilisha na kitu kilichokuwa hapo awali.

Kisha utaratibu huu unarudiwa, lakini utafutaji wa thamani ya chini (kiwango cha juu) hutokea kutoka kwa nafasi ya pili, nk. Mchoro wa algorithm hii umeonyeshwa kwenye Mchoro 4.

kupanga thamani programu


Kielelezo 4. Upangaji wa Uteuzi wa Moja kwa moja

Sehemu ya programu inayotekelezea kupanga kwa kutumia mbinu ya uteuzi wa moja kwa moja imetolewa hapa chini.

// panga vipengele vya safu kwa mpangilio wa kupanda

int temp;//kubadilika kwa hifadhi ya muda wakati wa kubadilishana maadili

int i;//utofauti wa udhibiti wa kitanzi (nambari ya kipengele cha safu)

int k;//utofauti wa udhibiti wa kitanzi (nambari ya hatua ya kupanga)

int nmin;// nambari ya thamani ya chini

kwa (k=0; i< к 1; i++)

// tafuta nambari ya kipengele cha chini kati ya orodha ya maadili [ i ... n -1]

kwa (i = k+1; i< n; i++)

ikiwa (orodha[i]< list[ nmin ]) nmin = i;

//badilisha orodha[ nmin ] na orodha[ k ]

temp = orodha[ nmin ];

list[ nmin ]= list[ k ];

list[ k ] = temp;

Ikumbukwe kwamba utafutaji wa thamani ya chini katika kitanzi cha ndani hutokea katika orodha iliyobaki.

Ili kupanga kwa utaratibu wa kushuka, unahitaji kupata thamani ya juu katika kila hatua badala ya thamani ya chini.

Siku nyingine, katika maoni kwenye VKontakte, nilikuwa na mabishano na mmoja wa wanafunzi wengine wa mradi huo. Kiini cha mzozo kilikuwa "nani atashinda" - njia ya sort() kutoka darasa la java.util.Arrays au utekelezaji uliojiandikia wa algoriti rahisi: Bubble(Bubble), kuingizwa(Inaingiza), uteuzi(kwa chaguo), ganda(Shell algorithm). Kwa wengine jibu swali hili inaweza kuwa dhahiri, lakini kwa kuwa mzozo uliibuka, licha ya ukweli kwamba kila mmoja wa wahusika alikuwa na "vyanzo vinavyoheshimiwa" kwa niaba ya maoni yao, iliamuliwa kufanya utafiti, kunyoosha suala la kijivu katika mchakato, kutekeleza algorithms kadhaa. . TL;DR: java.util.Arrays.sort() bila masharti inaongoza kwenye safu za vipengele 100,000, na ukubwa mdogo Njia ya Shell wakati mwingine inaweza kushindana nayo. Algorithms zingine zinazozingatiwa ni tupu kabisa na zinaweza kuwa muhimu tu chini ya hali zingine za kigeni. Sasa hebu tuangalie jinsi safu zinavyopangwa katika vifaa vyetu vya silicon uber.

Aina ya uteuzi. Inapanga kwa uteuzi

Wacha tuanze na rahisi zaidi na njia ya wazi. Kiini chake kinaonyeshwa kikamilifu kwetu na Robert Sedgwick katika hotuba yake ya video kwenye coursera (Nitanukuu uhuishaji kutoka hapo, ambao nilisisitiza vibaya kuwa gif): Kupitia safu kutoka kwa kipengele cha kwanza, tunatafuta kwenye upande wa kulia kwa kila hatua kipengele cha chini, ambayo tunabadilishana ya sasa. Kwa hivyo, tunahifadhi toleo la mwisho la safu yetu katika fomu iliyopangwa. Hapa kuna msimbo wa kutekeleza algorithm hii katika Java: aina ya utupu wa umma (int array) ( int n = array. urefu; kwa (int i = 0 ; i)< n; i ++ ) { int minIndex = min (array, i, n - 1 ) ; swap (array, i, minIndex) ; } } public static void swap (int array, int i, int j) { int temp = array[ i] ; array[ i] = array[ j] ; array[ j] = temp; } public static int min (int array, int begin, int end) { int minVal = array[ begin] ; int minIndex = begin; for (int i = begin + 1 ; i <= end; i++ ) { if (array[ i] < minVal) { minVal = array[ i] ; minIndex = i; } } return minIndex; } Анализ алгоритма показывает, что необходимо на каждом проходе прошерстить весть остаток массива, то есть нам понадобится ровно N + (N-1) + (N-2) + … + 1 = N^2/2 сравнений. Таким образом, сложность алгоритма составляет O(N^2). Что же это означает? А означает это, что, увеличив количество элементов в массиве (N) в 2 раза, мы увеличим время работы алгоритма не в 2, а в 2^2 = 4 раза. Увеличив N в 10 раз, время работы увеличим в 100 раз и так далее. На моем ноутбуке 2012 года с процессором Core i3 под Ubuntu 14.4 я получил следующее время работы:

Aina ya kuingiza. Aina ya kuingiza

Hapa wazo ni tofauti kidogo. Tena, wacha tugeukie uhuishaji kutoka kwa Daktari Sedgwick: Kilicho mbele bado hakijatazamwa na sisi, na kila kitu tunachoacha nyuma kila wakati kinabaki kwa mpangilio. Jambo ni kwamba "tunarejesha" kila kipengele kipya cha safu ya awali hadi mwanzo hadi "imesimama" kwenye kipengele kidogo. Kwa hivyo, tuna tena kupita N (kwa kila kipengele cha safu ya asili), lakini katika kila kupita, mara nyingi, hatuangalii salio zima, lakini sehemu tu. Hiyo ni, tutapata chaguo 1 + (N-1) + (N-2) + ... + N = N^2/2 ikiwa tu itabidi kurudisha kila kipengele kinachofuata mwanzoni kabisa, yaani, katika kesi hiyo. ya ingizo lililopangwa "kwa kinyume" safu (bahati mbaya, bahati mbaya). Katika kesi ya safu iliyopangwa tayari (hapa ni bahati) kutakuwa na burebie kamili - kwa kila kupita kuna kulinganisha moja tu na kuacha kipengele mahali, yaani, algorithm itafanya kazi kwa wakati sawia na N. Utata. ya algorithm itaamuliwa na kesi mbaya zaidi ya kinadharia, ambayo ni, O( N^2). Kwa wastani, muda wa uendeshaji utakuwa sawia na N^2/4, yaani, haraka mara mbili ya algoriti iliyotangulia. Katika utekelezaji wangu, kwa sababu ya utumiaji usio sawa wa vibali, wakati wa kukimbia ulikuwa mrefu kuliko ule wa Uteuzi. Ninapanga kusahihisha na kusasisha chapisho hivi karibuni. Hapa kuna nambari na matokeo ya kuiendesha kwenye mashine hiyo hiyo: aina ya utupu ya umma (int array) ( int urefu = safu. urefu; kwa (int i = 1 ; i< length; i++ ) { for (int j = i; j >= 1; j-- ) ( ikiwa (safu[ j]< array[ j - 1 ] ) swap (array, j, j - 1 ) ; else break ; } } }

Aina ya shell. Aina ya shell

Mwanamume mwenye busara, Donald Schell, aligundua nyuma mnamo 1959 kuwa kesi za gharama kubwa zaidi katika algorithm ya kuingizwa ni wakati kitu kinarudi mbali sana hadi mwanzo wa safu: kwa kupita kiasi tunarudisha kipengee mwanzo kwa nafasi kadhaa. , na kwa mwingine kupita karibu kupitia safu nzima hadi mwanzo ni mbali na ndefu. Je, inawezekana kufanya hivyo mara moja, kuruka kupitia vipengele kadhaa? Na akapata njia kama hiyo. Inajumuisha utekelezaji wa mfululizo wa aina maalum za sehemu, inayoitwa mtazamo wa jumla d-sort au, kulingana na Sedgwick, h-sort (ninashuku h inamaanisha kuruka). 3-aina, kwa mfano, italinganisha kipengee kinachohusika sio na kilichotangulia, lakini kitaruka mbili na kulinganisha na nafasi 3 nyuma. Ikibadilishwa, italinganisha tena na sehemu 3 nyuma na kadhalika. Jambo la msingi ni kwamba safu inayotokana itakuwa "3-iliyopangwa", yaani, nafasi isiyo sahihi ya vipengele itakuwa chini ya nafasi 3. Kufanya kazi na algorithm hii ya uingizaji itakuwa rahisi na ya kupendeza. Kwa njia, "aina 1" sio kitu zaidi ya algorithm ya kuchopeka =) Kwa kutumia mpangilio wa h kwa safu na viwango vya h vinavyopungua, tunaweza kupanga safu kubwa haraka. Hivi ndivyo inavyoonekana: Ugumu hapa ni jinsi ya kuchagua mlolongo sahihi aina za sehemu. Hatimaye, utendaji wa algorithm inategemea hii. Ya kawaida ni mlolongo uliopendekezwa na Donald Knuth: h = h*3 + 1, yaani, 1, 4, 13, 40, ... na kadhalika hadi 1/3 ya ukubwa wa safu. Mlolongo huu hutoa utendaji mzuri na pia ni rahisi kutekeleza. Uchambuzi wa algoriti unahitaji toni za lugha na uko nje ya uwezo wangu. Upana wa uchanganuzi pia huamuliwa na lahaja nyingi za mfuatano wa h. Kwa nguvu, tunaweza kusema kwamba kasi ya algorithm ni nzuri sana - jionee mwenyewe: Vipengee milioni chini ya sekunde! Na hapa kuna msimbo wa Java na mlolongo wa Knut. aina ya utupu wa umma (int array) ( int h = 1 ; wakati (h* 3< array. length) h = h * 3 + 1 ; while (h >= 1 ) ( hSort (safu, h); h = h/ 3 ; ) ) utupu wa faragha hSort (int array, int h) ( int urefu = safu. urefu; kwa (int i = h; i< length; i++ ) { for (int j = i; j >= h; j = j - h) ( ikiwa (safu[ j]< array[ j - h] ) swap (array, j, j - h) ; else break ; } } }

Aina ya Bubble. Mbinu ya Bubble

Hii ni classic! Takriban kila mpanga programu anayeanza hutumia kanuni hii. Ni ya kitambo sana hivi kwamba Dk. Sedgwick hakuwa hata na uhuishaji wake, kwa hivyo ilinibidi kufanya kazi hiyo mwenyewe. Hapa, kwa kila kupita, tunapitia safu kutoka mwanzo hadi mwisho, tukibadilishana vipengele vya jirani ambavyo haviko katika mpangilio. Matokeo yake, vipengele vikubwa zaidi "huelea" (kwa hiyo jina) hadi mwisho wa safu. Tunaanza kila kupita mpya kwa matumaini tukitumai kuwa safu tayari imepangwa (imepangwa = kweli). Mwishoni mwa kifungu, ikiwa tunaona kwamba tumefanya makosa, tunaanza kifungu kipya. Ugumu hapa ni kwamba, tena, tunapitia (karibu) safu nzima kwenye kila kupita. Ulinganisho hutokea kwa kila hatua, kubadilishana hutokea karibu kila hatua algorithm hii moja ya polepole zaidi (ikiwa tunazingatia zinazotekelezwa kwa busara, na sio "aina ya kutikisa" na zingine kama hizo). Inashangaza kwamba utata hapa pia utakuwa sawa na O(N^2), lakini mgawo ni wa juu zaidi kuliko ule wa uingizaji na uteuzi. Msimbo wa algoriti: aina ya utupu wa umma (int array) ( boolean isSorted; int nMinusOne = safu. urefu - 1 ; kwa (int i = 0 ; i< nMinusOne; i++ ) { isSorted = true ; for (int j = 0 ; j < nMinusOne - i; j++ ) { if (array[ j] >safu[ j + 1 ] ) ( badilisha (safu, j, j + 1); isSorted = false ; ) ) ikiwa (imepangwa) rudi; ) ) Muda wa kufanya kazi: Jisikie tofauti: zaidi ya nusu saa kwenye vipengele milioni! Hitimisho: Kamwe usitumie algorithm hii !!!

Muhtasari wa sehemu ya kwanza

Kama matokeo, napendekeza kutazama jedwali la jumla la algorithms hizi. Unaweza pia kulinganisha na matokeo ya mbinu iliyojengwa ndani ya java.util.Arrays.sort(). Inaonekana kama aina fulani ya uchawi - ni nini kinachoweza kuwa haraka kuliko Shell? Nitaandika juu ya hili katika sehemu inayofuata. Huko tutaangalia algorithms za aina za haraka zinazotumiwa sana, na pia unganisha aina, jifunze juu ya tofauti za njia za kupanga safu za aina za asili na kumbukumbu, na pia kufahamiana na kiolesura cha Kulinganishwa, ambacho ni muhimu sana katika suala hili;) Hapo chini unaweza kusoma grafu iliyojengwa kwa kipimo cha logarithmic kwa data ya jedwali. Laini ya laini, bora algorithm =) Kwa wale ambao wanataka kupakua mradi mzima na kukimbia vipimo peke yao, weka kiunga: Java Tutaonana katika sehemu inayofuata! =) Mbinu za kupanga za msingi Kama safari yetu ya kwanza katika uga wa kupanga algoriti, tutachunguza baadhi ya mbinu "msingi" zinazofanya kazi vyema kwa faili ndogo au faili zilizo na miundo maalum. Kuna sababu kadhaa kwa nini kusoma haya mbinu rahisi. Kwanza, hutupatia njia isiyo na uchungu ya kujifunza istilahi na utendakazi wa kimsingi wa kupanga algoriti, ambayo hutupatia msingi unaohitajika wa kusoma algoriti changamano zaidi. Pili, kwa shida nyingi za kupanga inaweza kuwa bora kutumia njia rahisi badala ya ngumu zaidi. algorithms ngumu. Hatimaye, baadhi ya mbinu rahisi zinaweza kupanuliwa hadi zaidi mbinu nzuri au zitumie kuboresha zile ngumu zaidi.Katika baadhi ya programu za kupanga, ni bora kutumia algoriti rahisi. Mipango ya kupanga mara nyingi hutumiwa mara moja tu (au mara kadhaa). Ikiwa idadi ya vipengele vinavyohitaji kupangwa si kubwa (sema, chini ya vipengele 500), basi inaweza kuwa kwamba kutumia algorithm rahisi itakuwa na ufanisi zaidi kuliko kuendeleza na kurekebisha algorithm tata. Njia za msingi zinafaa kila wakati kwa faili ndogo (sema, chini ya vitu 50); Haiwezekani kwamba algorithm tata itakuwa busara kutumia kwa faili kama hizo, isipokuwa bila shaka kuna haja ya kupanga. idadi kubwa ya faili kama hizo. Kama sheria, mbinu za msingi, ambayo tutajadili, kufanya kuhusu shughuli za kupanga N vipengele vilivyochaguliwa kwa nasibu. Kama N ndogo ya kutosha, basi hii inaweza kuwa tatizo, na ikiwa vipengele havijasambazwa kwa nasibu, basi algorithms hizi zinaweza kufanya kazi kwa kasi zaidi kuliko ngumu. Jambo la kukumbuka, hata hivyo, ni kwamba algorithms hizi hazipaswi kutumiwa kwa faili kubwa, zilizopangwa kwa nasibu, isipokuwa moja kuwa algorithm ya aina ya shell, ambayo hutumiwa mara nyingi katika programu nyingi. Kanuni za mchezo

Kabla ya kuangalia algoriti yoyote maalum, itakuwa muhimu kujifunza istilahi na kanuni za kimsingi kuhusu kupanga algoriti. Tutasoma algoriti za kupanga kurekodi faili zenye funguo. Funguo, ambazo ni sehemu tu ya rekodi (mara nyingi ni sehemu ndogo sana), hutumiwa kudhibiti mchakato wa kupanga. Madhumuni ya algoriti ya kupanga ni kupanga upya rekodi katika faili ili zionekane kwa mpangilio uliobainishwa kabisa (kwa kawaida kialfabeti au nambari).

Ikiwa faili ya kupangwa inafaa kabisa kwenye kumbukumbu (au inafaa kabisa kwenye safu), basi kwa hiyo tunatumia ndani njia za kupanga. Kupanga data kutoka kwa tepi au diski inaitwa ya nje kupanga. Tofauti kuu kati yao ni kwamba kwa upangaji wa ndani, rekodi yoyote inapatikana kwa urahisi, wakati kwa upangaji wa nje, tunaweza kutumia rekodi kwa mlolongo tu, au kwa vizuizi vikubwa. Algorithms nyingi za kupanga tutaangalia ni za ndani.

Kawaida, jambo kuu ambalo litatuvutia katika algorithm ni wakati wake wa kukimbia. Algoriti nne za kwanza tutaangalia kwa ajili ya kupanga vipengele vya N vina muda wa uendeshaji sawia, huku algoriti changamano zaidi zikitumia muda wa uendeshaji sawia. (Inaweza kuonyeshwa kuwa hakuna algoriti ya kupanga inayoweza kutumia chini ya ulinganisho kati ya funguo.) Baada ya kuchunguza mbinu rahisi, tutaangalia mbinu ngumu zaidi ambazo muda wa uendeshaji ni sawia na mbinu zinazotumia sifa binary za funguo ili kupunguza jumla ya muda wa uendeshaji N.

Kiasi kilichotumika kumbukumbu ya ziada algorithm ya kuchagua ni nyingine jambo muhimu, ambayo tutazingatia. Kwa ujumla, njia za kupanga zimegawanywa katika aina tatu:

njia za kupanga ambazo hupanga bila kutumia kumbukumbu yoyote ya ziada, isipokuwa labda safu ndogo na/au safu;

njia zinazotumika kupanga orodha zinazohusiana na kwa hivyo tumia N viashiria vya ziada vilivyohifadhiwa kwenye kumbukumbu;

na mbinu zinazohitaji kumbukumbu ya ziada ili kuhifadhi nakala ya faili inayopangwa.

Utulivu- tabia nyingine muhimu ya njia za kuchagua. Njia ya kupanga inaitwa imara, ikiwa itahifadhi mpangilio wa jamaa wa rekodi na funguo sawa. Kwa mfano, ikiwa orodha ya alfabeti vikundi vinapangwa kwa alama, njia thabiti huunda orodha ambayo majina ya wanafunzi walio na alama sawa yatapangwa kwa alfabeti, na njia isiyo thabiti itaunda orodha ambayo agizo la asili linaweza kukiukwa. Njia nyingi rahisi ni thabiti, wakati zile zinazojulikana zaidi mbinu tata- Hapana. Ikiwa uthabiti unahitajika, inaweza kupatikana kwa kuongeza fahirisi ndogo kwenye ufunguo kabla ya kupanga au kwa kurefusha ufunguo kwa njia fulani. Utulivu unakubalika kwa urahisi kama kawaida; watu hushughulikia ukosefu wa utulivu kwa kutoaminiana. Kwa kweli, mbinu chache hufikia utulivu bila matumizi ya muda au nafasi ya ziada.

Programu ifuatayo, ya kupanga rekodi tatu, inakusudiwa kuonyesha kanuni za kimsingi ambazo tutatumia. Hasa, programu kuu curious kwa kuwa inafanya kazi kwa N=3 tu; Jambo ni kwamba mpango wowote wa kupanga unaweza kupunguzwa kwa utaratibu aina3 programu hii.

Taarifa tatu za kazi, kila moja ikifuatiwa na opereta kama, kwa kweli, wanatekeleza operesheni ya "kubadilishana". Tunaibandika moja kwa moja ndani msimbo wa programu badala ya kutumia simu ya utaratibu, kwa kuwa ndio msingi wa algorithms nyingi na mara nyingi huanguka ndani ya kitanzi.

Ili kuangazia masuala ya algorithmic, tutafanya kazi na algoriti ambazo hupanga tu safu kamili za nambari kwa mpangilio wa nambari. Kwa ujumla, ni rahisi sana kurekebisha algorithms vile kwa matumizi ya vitendo, ambayo inajumuisha kufanya kazi na funguo kubwa au rekodi. Kimsingi, mipango ya kupanga hufanya kazi na rekodi kwa njia mbili: ama wanalinganisha na kupanga funguo tu, au huhamisha rekodi nzima. Algorithms nyingi tutakazosoma zinaweza kutumika, kwa kuziunda upya kulingana na shughuli hizi mbili, ili rekodi za kiholela. Ikiwa rekodi zinazopangwa ni kubwa sana, ni kawaida kujaribu kuzuia kuzisonga kupitia "aina isiyo ya moja kwa moja": hii haipangi upya rekodi zenyewe, lakini badala yake inapanga upya safu ya viashiria (faharisi) ili pointer ya kwanza ielekeze kipengele kidogo, na kadhalika. Funguo zinaweza kuhifadhiwa na rekodi (ikiwa ni kubwa) au kwa viashiria (ikiwa ni ndogo). Ikiwa ni lazima, unaweza kupanga upya rekodi baada ya kupanga. Hii imeelezwa hapa chini.

Mpango aina3 hutumia hata zaidi ufikiaji mdogo kwa faili: hizi ni shughuli tatu za fomu "linganisha rekodi mbili na ubadilishe, ikiwa ni lazima, kuweka rekodi na ufunguo mdogo katika nafasi ya kwanza." Programu zilizo na ukomo wa shughuli kama hizi zinavutia kwa sababu zinafaa kwa utekelezaji kiwango cha vifaa. Tutazisoma kwa undani zaidi baadaye.

Programu zote za sampuli hutumiwa kupanga safu ya kimataifa. Hii haimaanishi kuwa mbinu hii ni bora au mbaya zaidi kuliko kupitisha safu kama kigezo. Yote inategemea hatua ya mtazamo na algorithm maalum. Safu hiyo inafanywa kuwa ya kimataifa tu kwa sababu basi mifano inakuwa fupi na wazi zaidi.

Inapanga kwa uteuzi Mojawapo ya njia rahisi zaidi za kupanga hufanya kazi kama hii: pata kipengee kidogo zaidi kwenye safu na ubadilishe na kipengee mahali pa kwanza. Kisha tunarudia mchakato kutoka kwa nafasi ya pili kwenye faili na kubadilishana kipengele kilichopatikana na kipengele cha pili na kadhalika mpaka safu nzima itapangwa. Njia hii inaitwa aina ya uteuzi, kwa sababu inafanya kazi kwa kuchagua kwa mzunguko kipengele kidogo zaidi kilichosalia, kama inavyoonyeshwa kwenye Mchoro 1. Katika pasi ya kwanza, herufi ya nafasi inakwenda kwanza, ikibadilishana na herufi `P'. Katika kupita pili, kipengele `B' kinabadilishwa na kipengele `P', na kadhalika .Programu ifuatayo inatoa utekelezaji kamili wa mchakato huu.Kwa kila moja i kutoka 1 hadi N- 1 , inabadilisha kipengele kidogo zaidi cha [ i..N] na[ i]:Kadiri kiashiria kinavyosonga i kutoka kushoto kwenda kulia kupitia faili, vipengee vilivyo upande wa kushoto wa pointer tayari viko katika nafasi yao ya mwisho (na haitaguswa tena), kwa hivyo safu inakuwa imepangwa kikamilifu wakati pointer inafikia ukingo wa kulia. Njia hii ni mojawapo ya rahisi zaidi, na inafanya kazi vizuri sana kwa faili ndogo. "kitanzi chake cha ndani" kinajumuisha kulinganisha[ i]min] (pamoja na nambari inayohitajika ili kuongeza j na kuangalia kuwa haijazidi N Pia, ingawa aina ya uteuzi ni njia ya nguvu ya kikatili, ina matumizi muhimu sana: kwa kuwa kila kipengele huhamishwa mara moja, ni nzuri sana kwa rekodi kubwa zilizo na funguo ndogo. Aina ya kuingiza Njia kupanga ingiza, karibu rahisi kama aina ya uteuzi, lakini rahisi zaidi. Njia hii hutumiwa mara nyingi wakati wa kupanga kadi: tunachukua kipengele kimoja na kukiingiza mahali sahihi kati ya wale ambao tayari tumeshughulikia ( na hivyo kuwaacha wakiwa wamepangwa) kipengele kinachohusika kinaingizwa kwenye nafasi kwa kusogeza kipengele kikubwa nafasi moja hadi kwenye kulia na kisha kuweka kipengele kidogo kwenye nafasi iliyoachwa, kama inavyoonyeshwa kwenye Mchoro 2. Kwa hivyo `I" katika hatua ya tatu ni ndogo kuliko vipengele vingine vyote vilivyopangwa, kwa hivyo "tunaizamisha" hadi mwanzo wa safu. `M " ni kubwa kuliko `mimi" lakini chini ya nyingine zote, kwa hivyo tunaiweka kati ya `I' na `P', na kadhalika. Utaratibu huu unatekelezwa katika programu ifuatayo. Kwa kila i kutoka 2 hadi N, safu ndogo a hupangwa kwa kuweka[ i] kwa nafasi inayofaa kati ya vitu vilivyopangwa tayari: Kama ilivyo kwa aina ya uteuzi, wakati wa kupanga vitu upande wa kushoto wa pointer. i tayari ziko katika mpangilio uliopangwa, lakini si lazima ziwe katika nafasi ya mwisho, kwa kuwa bado zinaweza kuhamishwa hadi kulia ili kuingiza vipengele vidogo vilivyokutana baadaye. Mkusanyiko hupangwa kikamilifu wakati kielekezi kinapofika ukingo wa kulia. Hata hivyo, kuna maelezo moja muhimu zaidi: programu. kuingizwa haifanyi kazi kila wakati kwa sababu wakati inaweza kuruka juu ya ukingo wa kushoto wa safu wakati v- kipengele kidogo zaidi cha safu. Ili kurekebisha hali hiyo, tunaweka kitufe cha "mlinzi" katika a, na kuifanya angalau isiwe kubwa kuliko ufunguo mdogo zaidi katika safu. Walinzi hutumiwa sana katika hali kama hizi kuzuia ukaguzi wa ziada (in kwa kesi hii j>0), ambayo karibu kila mara husaidia katika vitanzi vya ndani. Aina ya Bubble Njia ya upangaji ya kawaida ambayo mara nyingi hutolewa madarasa ya utangulizi-Hii aina ya Bubble: Vipengee vya safu zilizo karibu hubadilishwa mradi jozi ambazo hazijapangwa zimekutana. Utekelezaji wa mbinu hii umetolewa hapa chini. Huenda ikachukua muda kuamini kwamba inafanya kazi kweli. Ili kufanya hivyo, angalia kwamba tunapokutana na kipengele cha juu wakati wa kupita kwanza, tunabadilishana na kila kipengele kwa haki yake mpaka iko katika nafasi ya kulia. Juu ya kupitisha pili, tunaweka kipengele cha pili cha juu katika nafasi ya mwisho, na kadhalika. Aina ya Bubble hufanya kazi kwa njia sawa na aina ya uteuzi, ingawa hufanya mengi zaidi kazi zaidi kusogeza kipengele kwenye nafasi yake ya mwisho. Tabia za aina rahisi zaidiMali 1 Aina ya uteuzi hutumia kuhusu kulinganisha na N kubadilishana.Mali 2Aina ya kuingiza hutumia kuhusu kulinganisha na kubadilishana kwa wastani, na mara mbili zaidi katika hali mbaya zaidi.Mali 3 Upangaji wa Bubble hutumia takriban. kulinganisha na kubadilishana katika hali ya wastani na mbaya zaidi.Mali 4 Upangaji wa uwekaji ni wa mstari kwa faili "zinazokaribia kupangwa".Mali 5 Aina ya uteuzi ni ya mstari kwa faili zilizo na rekodi kubwa na vitufe vidogo.Inapanga faili zilizo na rekodi kubwa Mara nyingi sana inawezekana (na kuhitajika) kuhakikisha kuwa wakati wa kupanga faili inayojumuisha vitu vya N, kwa kutumia njia yoyote, ni shughuli za kubadilishana N pekee zinazofanywa. rekodi kamili kwa kushughulikia kwa njia isiyo ya moja kwa moja vipengele vya safu (kwa kutumia safu ya faharisi au viashiria), na kufanya upangaji upya baada ya hapo. Hasa zaidi: ikiwa safu a ina maingizo makubwa, basi tutapendelea kutumia safu ya pointer p ili kujua. ambapo kipengele kinachofuata cha safu a iko, na kufanya ubadilishanaji wa uwongo. Ifuatayo ni programu ya kupanga uwekaji kwa kutumia safu ya viashiria: Ili kuzuia udhibiti usio wa lazima kwenye kitanzi, programu hutumia tena vipengele vya "saa." Hapo awali, fahirisi ziko katika mpangilio. Kisha utaratibu wa fahirisi huanza kubadilika ili safu a, kusoma kwa utaratibu ambao fahirisi zinasomwa, zimeagizwa.

Kwa hili tunaweza kutumia kufuata utaratibu, ambayo hupanga rekodi za faili kwa kutumia vibali vya N:

Aina ya shell Upangaji wa uwekaji ni wa polepole kwa sababu hubadilishana vipengele vilivyo karibu pekee. Aina ya Shell ni kiendelezi rahisi zaidi cha aina ya kuingizwa, ambayo huongeza kasi ya algorithm kutokana na ukweli kwamba hukuruhusu kubadilishana vitu ambavyo viko mbali na kila mmoja. Wazo kuu la algorithm ni kupanga vikundi vyote vya algorithm. faili inayojumuisha vipengele vya faili vilivyotenganishwa kutoka kwa kila mmoja kwa umbali h . Faili kama hizo huitwa h-sorted. Tunapopanga h faili kwa h kubwa, tunahamisha vipengele vyake kwa umbali mkubwa. Hii hurahisisha kazi ya kupanga kwa thamani ndogo za h. Mchakato huo unaisha wakati h inapungua hadi 1.

Programu iliyo hapo juu hutumia mlolongo ... 1093, 364, 121, 40, 13, 4, 1. Kunaweza kuwa na mlolongo mwingine - wengine bora zaidi, wengine mbaya zaidi.

Mali 6Aina ya Shell haifanyi zaidi ya N1.5 kulinganisha kwa mfuatano ulio hapo juu h.

Kuhesabu usambazaji Mara nyingi, tunajua kwamba thamani kuu katika faili ziko ndani ya masafa fulani. Katika hali hizi, algoriti inayoitwa kuhesabu usambazaji inatumika. Hapa kuna programu ya algorithm hii rahisi.

8 Aina ya kuingiza


9 A N Hebu iwe muhimu kupanga safu A kwa mpangilio wa kupaa, ambapo vipengele vya N vinaingizwa kwa kutumia mbinu ya kupachika Vigezo vya usaidizi j j ni nambari ya kipengele cha kwanza cha salio. i i - nambari ya kipengele kinachohamishwa. f f=1 f - sharti la kuondoka kwenye kitanzi (ikiwa f=1, kisha uondoke) Val Val - thamani ya kati inayotumiwa kusogeza vipengele vya safu taarifa ya Tatizo


A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti." title="10 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Ikiwa A>A [i] basi Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti." class="link_thumb"> 10 !} 10 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 wakifanya: Hatua ya Hatua Ikiwa A>A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. End of the algorithm."> A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:= i- 1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti."> A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti." title="10 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Ikiwa A>A [i] basi Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti."> title="10 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Ikiwa A>A[i] basi Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm."> !}


A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Je! "title="11 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya nini: Hatua ya 2.2.1 Hatua ya 2.2.1 Ikiwa A> A[ i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 2.3 j :=j+1. Mwisho wa algoriti. Inamaanisha nini?" class="link_thumb"> 11 !} 11 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 wakifanya: Hatua ya Hatua Ikiwa A>A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Ina maana gani hali hii? A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. "> A[i] inamaanisha nini basi Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i- 1 , Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti. Hali hii inamaanisha nini?"> A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Je! "title="11 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya nini: Hatua ya 2.2.1 Hatua ya 2.2.1 Ikiwa A> A[ i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 2.3 j :=j+1. Mwisho wa algoriti. Inamaanisha nini?"> title="11 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Ikiwa A>A[i] basi Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Ina maana gani"> !}


A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Why starts" title="12 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 kutekeleza: Hatua ya 2.2.1 Hatua ya 2.2.1 Ikiwa A> A[ i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 2.3 j :=j+1. Mwisho wa algoriti. Kwa nini huanza" class="link_thumb"> 12 !} 12 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 wakifanya: Hatua ya Hatua Ikiwa A>A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Kwa nini thamani ya kuanzia ni j =2? A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Why starts"> A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1 , Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti Kwa nini thamani ya kuanzia j =2 ? "> A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Why starts" title="12 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 kutekeleza: Hatua ya 2.2.1 Hatua ya 2.2.1 Ikiwa A> A[ i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 2.3 j :=j+1. Mwisho wa algoriti. Kwa nini huanza"> title="12 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Ikiwa A>A[i] basi Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Kwa nini huanza"> !}


A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Why starts" title="13 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Ikiwa A> A[ i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 2.3 j :=j+1. Mwisho wa algoriti. Kwa nini huanza" class="link_thumb"> 13 !} 13 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 wakifanya: Hatua ya Hatua Ikiwa A>A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Kwa nini thamani ya kuanzia i =2? A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Why starts"> A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1 , Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti Kwa nini thamani ya kuanzia i =2 ? "> A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Why starts" title="13 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Ikiwa A> A[ i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 2.3 j :=j+1. Mwisho wa algoriti. Kwa nini huanza"> title="13 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Ikiwa A>A[i] basi Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Kwa nini huanza"> !}


A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Je, ni kweli kila wakati" title="14 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Iwapo A>A [i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti. Je, ni kweli kila wakati" class="link_thumb"> 14 !} 14 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 wakifanya: Hatua ya Hatua Ikiwa A>A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Je, kipengele cha ingizo cha j hubadilishana kila wakati na kipengee kilichopangwa? A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Je, ni daima "> A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i- 1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti. Je, kipengele cha ingizo cha j kinabadilishana kila wakati na kipengele kilichopangwa?"> A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Je, ni kweli kila wakati" title="14 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Iwapo A>A [i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti. Je, ni kweli kila wakati"> title="14 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Ikiwa A>A[i] basi Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Je, inawezekana kila wakati"> !}


A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Je, inawezekana kwa" title="15 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Iwapo A>A [i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti. Je, inawezekana katika" class="link_thumb"> 15 !} 15 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 wakifanya: Hatua ya Hatua Ikiwa A>A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Je, inawezekana kubadilisha kitanzi cha BYE na IF na kitanzi kimoja cha BYE na hali i>=2 na A>A[i] ? A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Je, inawezekana kwa "> A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i - 1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti. Je, inawezekana kubadilisha kitanzi cha BYE na IF na kitanzi kimoja cha BYE na hali i>=2 na A>A[i] ?> A [i] kisha Val:= A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Je, inawezekana kwa" title="15 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Iwapo A>A [i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti. Je, inawezekana katika"> title="15 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Ikiwa A>A[i] basi Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Je, inawezekana kwa"> !}


A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Ni ya nini" title="16 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Iwapo A>A [i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti. Ni ya nini?" class="link_thumb"> 16 !} 16 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 wakifanya: Hatua ya Hatua Ikiwa A>A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Opereta huyu ni wa nini? A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. What is it for"> A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i - 1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti. Opereta hii ni ya nini? "> A[i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Ni ya nini" title="16 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Iwapo A>A [i] kisha Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algoriti. Ni ya nini?"> title="16 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=2, Hatua ya 2 Hatua ya 2 Wakati j=2 na f=0 hufanya: Hatua ya 2.2.1 Hatua ya 2.2.1 Ikiwa A>A[i] basi Val:=A; A:=A[i]; A[i]:=Val, vinginevyo f:=1, Hatua ya 2.2.2 Hatua ya 2.2.2 i:=i-1, Hatua ya 2.3 Hatua ya 2.3 j:=j+1. Mwisho wa algorithm. Inahitajika kwa nini"> !}




18 Kiini cha kupanga: Kipengele chenye thamani ya chini na inabadilishwa na kipengele cha kwanza cha safu. Kisha kipengele kilicho na thamani ndogo zaidi kutoka kwa vipengele vilivyobaki vya n-1 hupatikana na kinabadilishwa na kipengele cha pili, nk. kabla ya kubadilishana vipengele viwili vya mwisho.


Aina ya uteuzi Sehemu Iliyopangwa Sehemu iliyopangwa Mkusanyiko uliopangwa kwa mpangilio wa kupanda


20 Taarifa ya tatizo A N Hebu unahitaji kupanga safu A kwa utaratibu wa kupanda, ambapo kuna vipengele vya N kwa uteuzi. Vigezo vya msaidizi j j - nambari ya kipengele cha kwanza cha salio. i i - nambari ya kipengele kinachohamishwa. min min - nambari ya chini katika safu. Imin Imin - nambari ya nambari ya chini katika safu










25 Kiini cha kupanga: Mkusanyiko huchanganuliwa kwa mpangilio na kila jozi ya vipengele hulinganishwa na kila kimoja. Katika kesi hii, mpangilio "usio sahihi" wa vipengele huondolewa kwa kupanga upya. Mchakato wa kutazama na kulinganisha vipengele hurudiwa hadi safu nzima imetazamwa.


26 Kupanga kwa kubadilishana


27 A N Hebu iwe muhimu kupanga safu A kwa utaratibu wa kupanda, ambapo vipengele vya N vinabadilishwa kwa kutumia njia ya kubadilishana Vigezo vya msaidizi j j - idadi ya kipengele cha kwanza cha salio. i i - nambari ya kipengele kinachohamishwa. Val Val ni thamani ya kati inayotumiwa kuhamisha vipengele vya safu. Taarifa ya tatizo


2 fanya: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algorithm. Ulinganisho wa majirani" title="28 Mwanzo wa algoriti. Hatua ya 1 j:=N, Hatua ya 2 Hatua ya 2 Wakati j>=2 ikifanya: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algoriti. Ulinganisho wa majirani" class="link_thumb"> 28 !} 28 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=N, Hatua ya 2 Wakati j>=2 ikifanya: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algorithm. Kulinganisha vipengele vya jirani Badili vipengele vya jirani ikiwa kushoto ni kubwa kuliko kulia.Sehemu iliyopangwa imeundwa =2 fanya: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algorithm. Linganisha majirani "> =2 maonyesho: Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1 Mwisho wa algoriti Ulinganisho wa vipengele vya jirani Badili vipengele vya jirani, ikiwa cha kushoto ni kikubwa kuliko cha kulia.Sehemu iliyopangwa imeundwa. "> =2 fanya: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Huku iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algorithm. Ulinganisho wa majirani" title="28 Mwanzo wa algoriti. Hatua ya 1 j:=N, Hatua ya 2 Hatua ya 2 Wakati j>=2 ikifanya: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algoriti. Ulinganisho wa majirani"> title="28 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=N, Hatua ya 2 Wakati j>=2 ikifanya: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algorithm. Ulinganisho wa majirani"> !}


2 fanya: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algorithm. Kwa nini hali ni "title="29 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=N, Hatua ya 2 Hatua ya 2 Wakati j>=2 inatekeleza: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1 Mwisho wa algoriti Kwa nini hali ni sawa?" class="link_thumb"> 29 !} 29 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=N, Hatua ya 2 Wakati j>=2 ikifanya: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algorithm. Kwa nini hali hii? =2 fanya: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algorithm. Kwa nini hali ta"> =2 inatimizwa: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1 Mwisho wa algoriti. Kwa nini hali iko hivi?"> =2 fanya: Hatua ya 2.1 Hatua ya 2.1 i:=1 ;, Hatua ya 2.2 Hatua ya 2.2 Kwa sasa iA basi Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algorithm. Kwa nini hali ni "title="29 Mwanzo wa algoriti. Hatua ya 1 Hatua ya 1 j:=N, Hatua ya 2 Hatua ya 2 Wakati j>=2 inatekeleza: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1 Mwisho wa algoriti Kwa nini hali ni sawa?"> title="29 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=N, Hatua ya 2 Wakati j>=2 ikifanya: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algorithm. Kwa nini hali ni sawa?"> !}


2 fanya: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algorithm. Kwa nini thamani j" title="30 Mwanzo wa algoriti. Hatua ya 1 j:=N, Hatua ya 2 Hatua ya 2 Wakati j>=2 inatekeleza: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j- 1. Mwisho wa algorithm Kwa nini thamani ya j" class="link_thumb"> 30 !} 30 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=N, Hatua ya 2 Wakati j>=2 ikifanya: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algorithm. Kwa nini thamani ya j inapungua? Je, inawezekana kuiongeza? Ni nini kinachohitaji kubadilishwa? =2 fanya: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algorithm. Kwa nini thamani j"> =2 imetekelezwa: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algoriti. Kwa nini thamani ya j inapungua? Je, inaweza kuongezwa? Nini kinahitaji kubadilishwa?"> =2 fanya: Hatua ya 2.1 Hatua ya 2.1 i: =1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algorithm. Kwa nini thamani j" title="30 Mwanzo wa algoriti. Hatua ya 1 j:=N, Hatua ya 2 Hatua ya 2 Wakati j>=2 inatekeleza: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j- 1. Mwisho wa algorithm Kwa nini thamani ya j"> title="30 Mwanzo wa algorithm. Hatua ya 1 Hatua ya 1 j:=N, Hatua ya 2 Wakati j>=2 ikifanya: Hatua ya 2.1 Hatua ya 2.1 i:=1;, Hatua ya 2.2 Hatua ya 2.2 Wakati iA kisha Val:=A[i]; A[i]:=A; A:=Val, Hatua ya 2.2.2 Hatua ya 2.2.2 i=i+1, Hatua ya 2.3 Hatua ya 2.3 j:=j-1. Mwisho wa algorithm. Kwa nini ni thamani ya j"> !}










35 12 Hatua ya kupanga ganda. Vikundi 4 vya hatua 2 za vipengele. Vikundi 2 vya vipengele 4


36 Hatua ya kupanga ganda. Kundi 1 la vipengele 8 Mpangilio uliopangwa kwa mpangilio wa kupanda


37 A N Hebu iwe muhimu kupanga safu A kwa mpangilio wa kupanda, ambamo kuna vipengele vya N kwa kutumia mbinu ya Shell. Vigezo visaidizi j j ni nambari ya kipengele cha kwanza cha salio. i i - nambari ya kipengele kinachohamishwa. M- hatua mojawapo P P - thamani ya kati inayotumika kusogeza vipengele vya safu Taarifa ya tatizo














45 Kiini cha kupanga: Thamani fulani (x) imechaguliwa - kipengele cha kizuizi, ambacho kinatambuliwa kwa kuzungusha kwa mgawanyiko kamili wa idadi ya vipengele vilivyopangwa kwa 2; Tunapitia safu, tukisonga kutoka kushoto kwenda kulia, hadi tupate kipengee kikubwa kuliko x. Kisha tunakipitia kutoka kulia kwenda kushoto, hadi tupate kipengele chini ya x.


46 Kiini cha kupanga: Badilisha vipengele vilivyopatikana. Ikiwa kipengele kikubwa au kidogo zaidi hakipatikani, kipengele cha kati kinabadilishwa na kipengele kikubwa au kidogo kilichopatikana; Baada ya kufikia katikati tuna sehemu 2 za safu; Mchakato unaendelea kwa kila sehemu hadi safu itapangwa


7 inahamishiwa upande wa kulia, kwa sababu 16>7 haiwezi kuhamishwa, 47 inaweza kuhamishwa hadi upande wa kulia, kwa sababu 16>7, 8>7,11>7, 19>7 haiwezi kuhamishwa, 7=7 mshairi" title="(!LANG :47) Aina ya haraka 812371911416 Kipengele cha kizuizi 4378123 4 Kipengele cha kizuizi 8121119 Kipengele cha kizuizi 1219 1619 8>7 kinahamishwa kwa upande wa kulia, kwa sababu 16>7 haijahamishwa, 47 imehamishwa kwa upande wa kulia, kwa sababu 16>7, 18> 7, >7, 19>7 hazivumiliki, 7=7 mshairi" class="link_thumb"> 47 !} 47 Upangaji wa haraka Kipengee cha kizuizi Kipengele cha kizuizi >7 imehamishwa hadi upande wa kulia, kwa sababu 16>7 haijahamishwa, 47 inasogezwa upande wa kulia, kwa sababu 16>7, 8>7,11>7, 19> 7 haiwezi kuhamishwa, 7=7 kwa hivyo tunabadilisha 7 na 12 4>3 Sehemu iliyopangwa 12>11 inahamishiwa upande wa kulia, kwani > 11 haiwezi kuhamishwa, 811 inahamishiwa upande wa kulia, tangu 16>11, 12 >11,haiwezi kuhamishwa, 11 11=11 kwa hivyo tunabadilisha 11 na 19 Sehemu iliyopangwa 19>12 inahamishiwa upande wa kulia, kwa sababu 16>12,haiwezi kuhamishwa, 12 12=12 kwa hivyo tunabadilisha 12 na 19 19> 16 Safu imepangwa kwa mpangilio wa kupanda Chini ya 7 Kubwa kuliko 7 Tunasogeza 7 upande wa kulia, kwa sababu 16>7 haihamishwi, 47 inahamishiwa upande wa kulia, kwa sababu 16>7, 8>7,11>7, 19>7 haihamishwi, 7=7 mshairi"> Tunasonga 7 kwa upande wa kulia, kwa sababu 16>7 haiwezi kuhamishwa, 47 inahamishiwa upande wa kulia, kwa sababu 16>7, 8>7,11>7, 19>7 haiwezi kuhamishwa, 7=7, hivyo sisi kubadilishana maeneo 7 na 12 4>3 Sehemu iliyopangwa 12>11 inahamishiwa upande wa kulia, kwa sababu 8 12 16>11 haiwezi kuhamishwa, 811 inahamishiwa upande wa kulia, kwa sababu 16>11, 12>11 haiwezi kuhamishwa. , 11 11=11 kwa hivyo tunabadilisha 11 na 19 Sehemu iliyopangwa 19>12 imehamishwa hadi upande wa kulia, kwa sababu 16>12 haiwezi kuhamishwa, 12 12=12 kwa hivyo tunabadilisha 12 na 19 19>16 Safu imepangwa ndani. mpangilio wa kupanda Chini ni sawa 7 Kubwa kuliko 7"> 7 inahamishiwa upande wa kulia, kwa kuwa 16>7 haiwezi kuhamishwa, 47 inahamishiwa upande wa kulia, tangu 16>7, 8>7,11>7, 19>7 haiwezi kuhamishwa, 7=7 mshairi" title="47 Quick sort 812371911416 Kipengele cha kizuizi 4378123 4 Kipengele cha kizuizi 8121119 Kipengele cha kizuizi 1219 1619 8>7 kimehamishwa hadi upande wa kulia, kwa sababu 16>7 haiwezi kuhamishwa, 47 inasogezwa upande wa kulia , kwa sababu 16>7, 8>7,11>7, 19>7 haiwezi kuvumiliwa, 7=7 mshairi."> title="47 Aina ya haraka 812371911416 Kipengele cha kizuizi 4378123 4 Kipengele cha kizuizi 8121119 Kipengele cha kizuizi 1219 1619 8>7 kinahamishwa kwa upande wa kulia, kwa sababu 16>7 haiwezi kuhamishwa, 47 inahamishwa kwa upande wa kulia, kwa sababu 16>7, 8> 11>7, 19>7 isiyovumilika, 7=7 mshairi"> !}


48 A n Acha unahitaji kupanga safu A kwa mpangilio wa kupanda, ambamo kuna vipengele vya n njia ya haraka Vigezo saidizi: t – t – kipengele cha mwisho safu m - m ni kipengele cha awali cha safu x - x ni kipengele ambacho vipengele vingine vyote vinahamishwa. w – w – thamani ya kati inayotumika kusogeza vipengele vya safu Taarifa ya tatizo
















58 Utulivu - safu iliyopangwa haibadilishi mpangilio wa vipengele kutoka maadili sawa. Msimamo wa jamaa wa vipengele sawa na ufunguo 1 na mashamba ya ziada"a", "b", "c" Vigezo vya tathmini ya algoriti


59 Uasilia wa tabia - ufanisi wa mbinu wakati wa kuchakata data iliyopangwa tayari au iliyopangwa kwa sehemu. Algorithm inatenda kwa kawaida ikiwa itazingatia sifa hii ya mlolongo wa pembejeo na inafanya kazi vigezo bora tathmini ya algorithm


60 Tathmini ya algorithm ya aina ya uteuzi Jumla ya idadi ya ulinganisho C =N-l + N = (N 2 -N)/2 Jumla ya idadi ya shughuli n + (n-1) + (n-2) + (n-3) = 1 /2 * ( n 2 +n) = Theta(n 2) Idadi ya kubadilishana


63 Kutathmini Algorithm ya Kupanga Uingizaji Safu itahitaji ulinganisho wa N-1. Mkusanyiko utahitaji (N 2 -N)/2 ulinganisho. Jumla ya idadi ya shughuli za Theta(n 2)


66 Hapana njia ya ufanisi, kwa kuwa kuingizwa kwa kipengele kunahusishwa na mabadiliko ya vipengele vyote vya awali kwa nafasi moja, na operesheni hii sio ya kiuchumi. Kuchukuliwa pamoja, utulivu na tabia ya asili ya algorithm hufanya njia. chaguo zuri katika hali zinazofaa




70 Ulinganisho wa mbinu rahisi za kupanga N N - idadi ya vipengele, M M - idadi ya uhamisho, C - idadi ya ulinganisho Kima cha chini chaMajumuisho rahisi M=2(n-1) C = n-1 M=2(n-1) C=( n 2 -n)/2 М=(n+3n-4)/2 М=(n 2 +3n-4)/2 Ubadilishanaji rahisi C=(n 2 -n)/2M=3(n-1) С =(n 2 -n)/2 М=n/4+3(n-1) М=n 2 /4+3(n-1) Chaguo rahisi C=(n 2 -n)/2 M = 0 С =(n 2 -n)/2 М=(n-n)*1.5 М=(n 2 -n)*1.5? Idadi ya uhamisho itakuwa ngapi?




72 Tathmini ya algoriti ya Shell n 1.2 Muda wa utekelezaji ni sawia na n 1.2, kwa kuwa kila pasi hutumia idadi ndogo vipengele au vipengee vya safu tayari viko katika mpangilio wa jamaa, na upangaji huongezeka kwa kila utazamaji mpya wa data


73 Kutathmini Algorithm ya Quicksort N=2g X N N/2N/2 Ikiwa saizi ya safu ni nguvu ya nambari mbili (N=2g), na kila kipengee kilichogawanyika kinaweka X katikati kabisa ya safu, kisha kwenye mwonekano wa kwanza. , N kulinganisha hufanywa na safu imegawanywa katika sehemu mbili za kupima N/2. Kwa kila sehemu hizi kuna kulinganisha N/2, nk Kwa hiyo C=N+2*(N/2)+4*(N/4)+...+N*(N/N). N Ikiwa N sio nguvu ya mbili, basi makadirio yatakuwa ya mpangilio sawa


74 Theta(n). Jumla ya idadi ya shughuli za Theta(n). log n O(n logi n) Idadi ya hatua za mgawanyiko (kina cha kujirudia) ni takriban logi n ikiwa safu imegawanywa katika sehemu zaidi au chini sawa. Kwa hivyo, utendakazi wa jumla ni: O(n logi n) O(n 2) Ikiwa kila wakati kiwango cha juu au cha chini zaidi cha mlolongo wa uingizaji kinachaguliwa kama kipengele kikuu, basi utendakazi ni O(n 2)






77 Maswali ya kudhibiti? "Kupanga" ni nini? ? Mbinu ya uteuzi ni nini? ? Mbinu ya kupanga ni ipi? ? Njia ya kupanga Bubble ni nini? ? Je, ni njia gani ya kupanga haraka? ? Mbinu ya kupanga ya Shell ni ipi?


78 Maswali ya mtihani? Ni algorithm gani ya kupanga inachukuliwa kuwa rahisi zaidi? ? Ni algorithm gani ya kupanga inachukuliwa kuwa bora zaidi? ? Je, kuna vikundi vingapi vya algoriti za kupanga? ? Algorithms ya kupanga inaonyeshwa kwa vigezo gani? ? Unapaswa kuzingatia nini wakati wa kuchagua algorithm ya kupanga?

Sio tu kwamba haizingatiwi njia ya haraka zaidi, zaidi ya hayo, inafunga orodha ya njia za kuagiza polepole zaidi. Hata hivyo, pia ina faida zake. Kwa hivyo, upangaji wa Bubble ndio suluhisho la kimantiki zaidi na la asili kwa shida ikiwa unahitaji kupanga vitu kwa mpangilio fulani. Mtu wa kawaida manually, kwa mfano, itatumia hasa - tu kwa Intuition.

Jina lisilo la kawaida kama hilo lilitoka wapi?

Jina la njia hiyo liligunduliwa kwa kutumia mlinganisho na Bubbles za hewa kwenye maji. Hii ni sitiari. Kama vile Bubbles ndogo za hewa huinuka juu - baada ya yote, msongamano wao ni mkubwa kuliko ule wa kioevu chochote (katika kesi hii, maji), kwa hivyo kila kipengele cha safu, ni ndogo kwa thamani, ndivyo inavyofanya hatua kwa hatua. njia ya mwanzo wa orodha ya nambari.

Maelezo ya algorithm

Aina ya Bubble inafanya kazi kama hii:

  • kwanza kupita: vipengele vya safu ya nambari huchukuliwa mbili kwa wakati mmoja na pia ikilinganishwa na jozi. Ikiwa katika jozi fulani ya vipengele thamani ya kwanza ni kubwa kuliko ya pili, programu inawabadilisha;
  • kwa hivyo huishia mwisho wa safu. Wakati vipengele vingine vyote vinabaki kama vilivyokuwa, katika mpangilio wa machafuko na vinahitaji upangaji zaidi;
  • ndio maana kupita kwa pili ni muhimu: inafanywa kwa mlinganisho na ile ya awali (tayari imeelezewa) na ina idadi ya kulinganisha - minus moja;
  • Nambari ya kifungu cha tatu ina kulinganisha moja chache kuliko ya pili, na mbili chini ya ya kwanza. Nakadhalika;
  • Wacha tufanye muhtasari wa kila kupita inayo (jumla ya maadili katika safu, nambari maalum) minus (nambari ya kupita) kulinganisha.

Algorithm fupi zaidi programu ya baadaye inaweza kuandikwa kama hii:

  • safu ya nambari inakaguliwa hadi nambari zozote mbili zinapatikana, na ya pili lazima iwe kubwa kuliko ya kwanza;
  • Programu hubadilishana vipengele vya safu ambavyo vimewekwa vibaya kuhusiana na kila kimoja.

Pseudocode kulingana na algorithm iliyoelezwa

wengi zaidi utekelezaji rahisi imefanywa hivi:

Utaratibu Sortirovka_Puzirkom;

Anza

kitanzi kwa j kutoka faharisi_ya_anzilishi kabla index_ya_konechii;

kitanzi kwa i kutoka faharisi_ya_anzilishi kabla konechii_index-1;

Kama massiv[i]>massiv

(badilisha maadili);

Mwisho

Bila shaka, hapa unyenyekevu huongeza tu hali: kuliko algorithm rahisi zaidi, hasa kwa vile mapungufu yote yanaonekana ndani yake. Matumizi ya wakati ni kubwa sana hata kwa safu ndogo (uhusiano unakuja hapa: kwa mtu wa kawaida, muda unaweza kuonekana kuwa mdogo, lakini katika biashara ya programu, kila sekunde au hata hesabu za millisecond).

Utekelezaji bora zaidi ulihitajika. Kwa mfano, kwa kuzingatia ubadilishaji wa maadili katika safu:

Utaratibu Sortirovka_Puzirkom;

Anza

sortirovka = kweli;

mzunguko hadi sasa sortirovka = kweli;

sortirovka = uongo;

kitanzi kwa i kutoka faharisi_ya_anzilishi kabla konechii_index-1;

Kama massiv[i]>massiv(kipengele cha kwanza ni kikubwa kuliko cha pili), basi:

(badilisha vipengele);

sortirovka = kweli; (ilionyesha kuwa kubadilishana kulifanyika).

Mwisho.

Hasara za njia

Hasara kuu ni muda wa mchakato. Inachukua muda gani kutengeneza kiputo?

Wakati wa utekelezaji umehesabiwa kutoka kwa mraba wa idadi ya nambari katika safu - matokeo ya mwisho ni sawia nayo.

Katika hali mbaya zaidi, safu itapitiwa kwa idadi sawa ya nyakati kwani kuna vipengee ndani yake kando ya thamani moja. Hii hutokea kwa sababu hatimaye kuna kipengele kimoja tu kilichosalia bila chochote cha kulinganisha na, na kupita kwa mwisho kwa safu inakuwa hatua isiyo na maana.

Kwa kuongeza, njia ya kuchagua inafaa kubadilishana rahisi, kama inavyoitwa pia, ni ya safu tu ukubwa mdogo. Haitawezekana kusindika kiasi kikubwa cha data kwa msaada wake: matokeo yatakuwa ama makosa au kushindwa kwa programu.

Faida

Aina ya Bubble ni rahisi kuelewa. KATIKA programu za elimu Vyuo vikuu vya ufundi huchukua kwanza wakati wa kusoma mpangilio wa vitu vya safu. Njia hiyo inatekelezwa kwa urahisi katika lugha zote mbili Programu ya Delphi(D (Delphi) na C/C++ (C/C plus plus), algoriti rahisi sana ya kupanga maadili kwa mpangilio sahihi na Aina ya Bubble ni bora kwa wanaoanza.

Kwa sababu ya mapungufu yake, algorithm haitumiwi kwa madhumuni ya ziada.

Kanuni ya upangaji inayoonekana

Mtazamo wa awali wa safu 8 22 4 74 44 37 1 7

Hatua ya 1 8 22 4 74 44 37 1 7

8 22 4 74 44 1 37 7

8 22 4 74 1 44 37 7

8 22 4 1 74 44 37 7

8 22 1 4 74 44 37 7

8 1 22 4 74 44 37 7

1 8 22 4 74 44 37 7

Hatua ya 2 1 8 22 4 74 44 7 37

1 8 22 4 74 7 44 37

1 8 22 4 7 74 44 37

1 8 22 4 7 74 44 37

1 8 4 22 7 74 44 37

1 4 8 22 7 74 44 37

Hatua ya 3 1 4 8 22 7 74 37 44

1 4 8 22 7 37 74 44

1 4 8 22 7 37 74 44

1 4 8 7 22 37 74 44

1 4 7 8 22 37 74 44

Hatua ya 4 1 4 7 8 22 37 44 74

1 4 7 8 22 37 44 74

1 4 7 8 22 37 44 74

1 4 7 8 22 37 44 74

Hatua ya 5 1 4 7 8 22 37 44 74

1 4 7 8 22 37 44 74

1 4 7 8 22 37 44 74

Hatua ya 6 1 4 7 8 22 37 44 74

1 4 7 8 22 37 44 74

Hatua ya 7 1 4 7 8 22 37 44 74

Mfano wa aina ya Bubble katika Pascal

Mfano:

const kol_mas=10;

var array:safu ya nambari kamili;

a, b, k: nambari kamili;

writeln("pembejeo", kol_mas, "vipengele vya safu");

kwa:=1 hadi kol_mas do readln(array[a]);

kwa:=1 hadi kol_mas-1 huanza

kwa b:=a+1 hadi kol_mas huanza

ikiwa massiv[a]>massiv[b] basi anza

k:=safu[a]; massiv[a]:=massiv[b]; safu[b]:=k;

mwisho;

writeln("baada ya kupanga");

kwa:=1 hadi kol_mas do writeln(massiv[a]);

Mfano wa kupanga viputo katika lugha C

#pamoja na

#pamoja na

int main(int argc, char* argv)

int massiv = (36, 697, 73, 82, 68, 12, 183, 88), i, ff;

kwa (;;)(

ff = 0;

kwa (i = 7; i>0; i--)(

ikiwa (safu[i]< massiv) {

kubadilishana(safu[i],massiv);

ikiwa (ff == 0) itavunjika;

kupata (); // kuchelewa kwa skrini