Data sorteermethoden - presentatie. Sorteermethoden

Dit artikel bespreekt arrays sorteeralgoritmen. Om te beginnen worden geselecteerde algoritmen gepresenteerd met een korte beschrijving van hun werk, waarna het testen rechtstreeks wordt uitgevoerd, waarvan de resultaten in de tabel worden opgenomen en de eindconclusies worden gemaakt.

Het sorteren van algoritmen worden zeer veel gebruikt bij het programmeren, maar soms denken programmeurs niet eens over welk algoritme beter werkt dan alles (onder het concept van "best van alles" betekent een combinatie van snelheid en complexiteit van zowel schrijven als uitvoering).

In dit artikel zullen we proberen het uit te zoeken. Om de beste resultaten te garanderen, worden alle gepresenteerde algoritmen een geheel getal-reeks van 200 elementen sorteren. De computer waarop tests worden uitgevoerd, heeft de volgende kenmerken: AMD A6-3400M 4x1.4 GHz-processor, 8 GB RAM, Windows-besturingssysteem 10 X64 Build 10586.36.

Voor het onderzoek werden de volgende sorteeralgoritmen geselecteerd:

Selectie Sorteer (Sorteer op selectie) - De essentie van het algoritme ligt in de doorgang langs de array van het begin tot het einde in de zoektocht naar het minimumelement van de array en het verplaatsen naar het begin. De complexiteit van een dergelijk O (N2) -algoritme.

Bubble sorteren (sorteren op bubble) - Dit algoritme verandert in plaatsen twee aangrenzende elementen als het eerste element van de array groter is dan de tweede. Dit gebeurt totdat het algoritme alle niet-gesorteerde elementen op plaatsen uitwisselt. De complexiteit van dit sorteeralgoritme is O (N ^ 2).

Insertion Sorteer (sorteerinzetstukken) - Het algoritme sorteert een array omdat het door zijn elementen gaat. Element neemt elke iteratie en vergeleken met elk element in het reeds gesorteerde deel van de array, dus het vinden van "zijn plaats", waarna het element in zijn positie wordt ingebracht. Dit gebeurt totdat het algoritme door het massief passeert. Bij de uitgang krijgen we een gesorteerde array. De complexiteit van dit algoritme is gelijk aan O (N ^ 2).

Snelle sorteer (snelle sorteer) - De essentie van het algoritme is om de array te verdelen voor twee sub-array, de middelste lijn wordt beschouwd als een element dat zich in het midden van de array bevindt. In de loop van het werk van het algoritme zullen elementen minder dan het gemiddelde naar links en groot rechts worden verplaatst. Dezelfde actie zal recursief en met onder-array voorkomen, ze zullen worden onderverdeeld in twee onder-array totdat er iets te gescheiden is (één element zal blijven). Bij de uitgang krijgen we een gesorteerde array. De complexiteit van het algoritme is afhankelijk van de invoergegevens en is op zijn best gelijk aan O (N × 2LOG2N). In het ergste geval o (n ^ 2). Er is ook een gemiddelde waarde, dit o (n × log2n).

Kam sorteren (sorteerkam) - Het idee van het werk van het algoritme is uitermate vergelijkbaar met het sorteren van de uitwisseling, maar het belangrijkste verschil is dat niet twee aangrenzende elementen worden vergeleken, maar elementen op het interval, bijvoorbeeld in vijf elementen. Het geeft aan het ontdoen van kleine waarden aan het einde, wat bijdraagt \u200b\u200baan de versnelling van sortering in grote arrays. De eerste iteratie wordt uitgevoerd in een stap die wordt berekend door de formule (array-grootte) / (afname factor), waarbij de afnamefactor ongeveer 1.247330950103979 is, of afgerond tot 1,3. De tweede en daaropvolgende iteraties zullen plaatsvinden in een stap (huidige stap) / (reductiefactor) en zullen plaatsvinden totdat de stap gelijk is aan één. Bijna in ieder geval is de complexiteit van het algoritme gelijk aan O (N × Log2N).

Voor testen wordt het uitgevoerd op 5 lanceringen van elk algoritme en is de beste tijd geselecteerd. De beste tijd en het gebruikte geheugen worden vermeld in de tabel. Het testen van de sorteersnelheid van een array van 10, 50, 200 en 1000 elementen zal worden getest om te bepalen voor welke taken een specifiek algoritme is bedoeld.

Volledig ongezouten array:

Gedeeltelijk gesorteerde array (de helft van de elementen wordt besteld):

Resultaten verstrekt in diagrammen:

Als gevolg van het verkregen onderzoek en gegevens, om de ongezette array te sorteren, is de meest optimale van de gepresenteerde algoritmen voor het sorteren van de array snel sorteren. Ondanks de langere uitvoeringstijd verbruikt het algoritme minder geheugen, wat belangrijk kan zijn in grote projecten. Echter, dergelijke algoritmen als sorteren door de keuze, uitwisseling en inserts kunnen echter beter wetenschappelijke doeleinden benaderen, bijvoorbeeld bij het leren waar u geen enorme hoeveelheid gegevens hoeft aan te pakken. Met een gedeeltelijk gesorteerde array zijn de resultaten niet erg verschillend, alle sorteeralgoritmen tonen de tijd voor ongeveer 2-3 milliseconden minder. Bij het sorteren van een gedeeltelijk gesorteerde array werkt snel sortering veel sneller en verbruikt een kleinere hoeveelheid geheugen.

Het artikel bespreekt een van de meest populaire sorteeralgoritmen voor arrays die zowel praktisch als voor trainingsdoeleinden worden gebruikt. Meteen wil ik een reservering maken dat alle beschouwde algoritmen langzamer zijn dan de methode van klassieke sortering van de array door de lijst met waarden, maar toch de aandacht verdienen. Er zijn veel teksten, dus volgens elk algoritme beschrijf ik de meest elementaire.

1. Het algoritme "Sorteren op selectie".

Het is een van de eenvoudigste solide sorteeralgoritmen. De betekenis is om door de array te gaan en elke keer dat het is om te zoeken naar het minimumelement van de array, het uitwisselen van het met het initiële element van het ongezette deel van de array. In kleine arrays kan het nog efficiënter zijn dan meer complexe sorteeralgoritmen, maar verliest in elk geval op grote arrays. Het aantal uitwisselingen van elementen in vergelijking met de "bubble" -algoritme N / 2, waarbij n het aantal array-elementen is.

Algoritme:
1. Zoek het minimumelement in de array.
2. Wij veranderen het minimum- en eerste element op plaatsen.
3. Nogmaals, we zoeken het minimumelement in het ongezouten deel van de array
4. Wij veranderen het tweede element van de array en het gevonden minimum, omdat het eerste element van de array is gesorteerd.
5. We zijn op zoek naar minimale waarden en veranderen plaatst de elementen totdat de array tot het einde is gesorteerd.

// selecteren van de selectie (--- functie sorteren / zoomen (teken array) min \u003d 0; voor i \u003d 0 door array.vurrant () Cycle min \u003d i; voor j \u003d i + 1 door array () Cyclus // Wij zijn op zoek naar minimaal element in een array als een array [J]< Массив[Мин] Тогда Мин = j; КонецЕсли; КонецЦикла; Если Массив [Мин] = Массив [i] Тогда //Если мин. элемент массива = первому элементу неотс. части массива, то пропускаем. Продолжить; КонецЕсли; Смена = Массив[i]; //Производим замену элементов массива. Массив[i] = Массив[Мин]; Массив[Мин] = Смена; КонецЦикла; Возврат Массив; КонецФункции

2. Sorteer op bubble-algoritme.

Misschien is het beroemdste algoritme dat is toegepast voor academische doeleinden te traag voor de praktische toepassing. Het algoritme ligt ten grondslag aan meer complexe algoritmen: "Shaker sorteren", "Pyramidale sorteren", "Snelle sorteren". Het is opmerkelijk dat een van de snelste algoritmen "Snel algoritme" is ontwikkeld door een van de slechtste bubbel sorteeralgoritmen te upgraden. "Snel" en "Shaker" sorteren wordt verder overwogen. De betekenis van het algoritme is dat de meest "lichte" elementen van de array als het "pop-up" is, en de meest "zware" dun ". Vandaar de naam "Sorteren op bubble"

Algoritme:
1. Elk element van de array wordt vergeleken met de daaropvolgende en als het [I] -element\u003e -element wordt vervangen. Dus, de meest "lichte" elementen zijn "pop-up" - ga naar de bovenkant van de lijst, en de moeilijkste "drone" beweegt tot een einde.
2. We herhalen stap 1 N-1 keer, waarbij n een array is. Nieuwe nomecy ().

// Sorteren op een bubbel (--- functie met een soort verband (monsterarray) voor i \u003d 0 door array.vürnica () Cyclus voor j \u003d 0 door array.v.vurrant () - I - 1 cyclus als een array [j]\u003e array DAN vervanging \u003d een array [J]; array [J] \u003d array; array \u003d vervanging; beëindigd; Endackel; Sandflose; retour-array; Eindfunctie //--)

3. Garrier "Shaker Sorting" (sorteren op roeren, bidirectionele bubble sorteren).

Het algoritme is een van de versies van de vorige sortering - "Sorteren door Bubble". Het belangrijkste verschil is dat in de klassieke sortering de bubbel een unidirectionele beweging van elementen uit de onderkant optreedt, dan in de shaker-sortering, het neemt de bottom-up en vervolgens op top-down.

Het algoritme is hetzelfde als in bubble sorteren + de luscyclus van bovenaf is toegevoegd.

In het onderstaande voorbeeld is er een verbetering van de shaker-sortering. In tegenstelling tot klassiek, 2 keer minder gebruikt dan iteraties.

// Sorteren (Shaker-sorteren) (--- functie sorteren permeyssing (monster array) voor i \u003d 0 door array.Vurrant () / 2 Нитер \u003d 0; context \u003d array (); tot niter array [niter + 1] Vervanging \u003d array [niter]; array [niter] \u003d array [niter + 1]; array [niter + 1] \u003d vervanging; beëindigd; niter \u003d niter + 1; // bewegende de positie vooruit // passeren met einde Array [ConinterTee - 1]\u003e Een array [conintertee] dan vervangen \u003d array [conintertee - 1]; array [coniferous-1] \u003d array [conisator]; array [conisator] \u003d vervanging; beëindigd; context \u003d transporteur - 1; / / Verplaats de positie een stap achteruit; de endackel; retourarray; endfunctie // ---)

4. Algoritme "GNOME SORTING".

Het algoritme is zo vreemd genoemd dankzij de Nederlandse wetenschapper Dick Pear.

GNOME Gesorteerd is gebaseerd op de techniek die wordt gebruikt door de gebruikelijke Nederlandse Tuin GNOME (NETERL. TUINKABOUTER). Dit is een methode die de Garden Gnome de bloempotleiding sorteert. In wezen kijkt hij naar de volgende en vorige tuinpotten: als ze in de juiste volgorde zijn, loopt hij op één pot naar voren, anders verandert hij ze op plaatsen en loopt op één pot terug. Grensvoorwaarden: als er geen eerdere pot is, stopt hij naar voren; Als er geen volgende pot is, eindigde hij.
Dick arm.

Hier is de daadwerkelijke beschrijving van het algoritme "GNOME SORTING". Wat interessant is, bevat het algoritme geen geneste cycli en sorteert de hele array in één pas.

// gnome sorteren (--- de functie van de dwarfish (tekenarray) i \u003d 1; j \u003d 2; tot nu toe< Массив.Количество() Цикл // Сравнение < - Сортировка по возрастанию, > - Aflopend als een array i \u003d J; j \u003d j + 1; Anders is de vervanging \u003d array [i]; Array [i] \u003d array; Array \u003d vervanging; i \u003d I - 1; Als ik \u003d 0 dan I \u003d J; j \u003d j + 1; Eindigde; Eindigde; Endcycle; Een array retourneren; Endfunctie // ---)

5. Algoritme "Sorteren op inserts".

Het is een eenvoudig sorteeralgoritme. De betekenis is dat we bij elke stap een element nemen, we zijn op zoek naar een positie voor hem en inslaan op de juiste plaats.
Elementair voorbeeld: bij het spelen in een dwaas, trekt u de kaart uit het dek en steekt u deze in een geschikte plaats in een toename in uw beschikbare kaarten. Of
in de winkel heb je een levering van 550 roebel, één rekening van 500, nog eens 50. Ze kijken in de portemonnee, en er is een waardigheid van 10.100.1000. Je plaatst rekeningen
dosto Compound 50p. Tussen de rekeningen van waardigheid 10P en 100R, en de rekening van 500 roebel tussen rekeningen 100 roebel en 1000r. Het blijkt 10.50.100.500.1000 - hier ben jij
en het algoritme "sorteer inserts."
Met elke stap van het algoritme moet u de gegevens op de informatie sorteren en de waarde op de juiste plaats invoegen.


// Sorteer op inserts (--- functie sorteren. En vervanging< Массив Цикл Массив[j] = Массив; Замена = j - 1; Ключ = j - 1; j = j - 1; КонецЦикла; Массив[Ключ] = Замена; КонецЦикла; Возврат Массив; КонецФункции //---}

6. Algoritme "sorteren sorteren".

Interessant in termen van implementatie en ideeën-algoritme. De betekenis ervan om de array op de rebellen te doorbreken totdat de lengte van elke onderzeeër gelijk is aan 1. Dan beweren we dat een dergelijk subsysteem is gesorteerd. Dan voegen we de resulterende submassagels samen, tegelijkertijd de elementaire waarden van de onderzeeërs te vergelijken en te sorteren.

p / S kon geen tekening plaatsen met een meer visuele regeling, constant besmeurd. Maar het is duidelijk zichtbaar in het screenshots blokkeren hieronder. Je kunt zien hoe het algoritme werkt.

// samenvoegen sorteren (---

Sorteerfunctie (tekenarray) als een array. Racing () \u003d 1 retourneer de array; Eindigde; Punt) \u003d array. Naliteit () / 2; LJASIVE \u003d nieuwe array; PASSIVE \u003d nieuwe array; Voor SCH \u003d 0 door array.vurrant () Cycle IF SCH< ТочкаРазрыв Тогда лМассив.Добавить(Массив[Сч]); Иначе прМассив.Добавить(Массив[Сч]); КонецЕсли; КонецЦикла; Возврат Слияние(СортировкаСлиянием(лМассив),СортировкаСлиянием(прМассив)); КонецФункции Функция Слияние(массив1,массив2) a = 0; b = 0; слМассив = Новый Массив; Для Сч = 0 ПО (Массив1.Количество() + Массив2.Количество())-1 Цикл слМассив.Добавить(); КонецЦикла; Для i = 0 ПО (массив1.Количество() + массив2.Количество())-1 Цикл Если b < массив2.Количество() И a < массив1.Количество() Тогда Если (массив1[a] > array 2 [b]) en (b< массив2.Количество()) Тогда слМассив[i] = массив2[b]; b = b + 1; Иначе слМассив[i] = массив1[a]; a = a + 1; КонецЕсли; Иначе Если b < массив2.количество() Тогда слМассив[i] = массив2[b]; b = b + 1; Иначе слМассив[i] = массив1[a]; a = a + 1; КонецЕсли; КонецЕсли; КонецЦикла; Возврат слМассив; КонецФункции //---}

7. Allegortim "Sorteer Shell".

Het algoritme wordt zo genoemd ter ere van de Amerikaanse wetenschapper Donald Shell. In wezen is dit algoritme een verbeterde algoritme "sorteerinzetstukken". De betekenis van het algoritme is om niet alleen de elementen naast elkaar te vergelijken, maar op enige afstand. Aanvankelijk wordt een stap geselecteerd - een interval waardoor de elementen van de array worden vergeleken met elke iteratie. Het wordt meestal door dit bepaald:
Voor de eerste iteratie, stap \u003d inname (array. Nationaliteit () / 2), voor opeenvolgende stap \u003d 2 (stap / 2). Die. Geleidelijk wordt de stap verminderd en wanneer de stap gelijk is aan 1, zal de laatste vergelijking plaatsvinden en wordt de array gesorteerd.

Voorbeeld:
Een array wordt gegeven (10,5,31,14,27,12).
1. Stap \u003d 4.
We assorteren de eenvoudige inserts elke 4 groepen van 2 elementen (10.14) (5.2) (3.7) (1.12)

10 ,2 ,3 ,1,14 ,5 ,7 ,12

2. Stap \u003d 2
We assorteren de eenvoudige inserts elke 2 groepen van 4 elementen (10,3,114,7) (2,15,12)

3 ,1 ,7 ,2 ,10 ,5 ,14 ,12

3. Stap \u003d 1
We sorteren de eenvoudige inzetstukken elke 1 groep van 8 elementen.

1,2,3,5,7,10,12,14


// Sorteer Shell (--- Function Sortingchella (Sign Array) Stap \u003d Complex (array. Naliteit () / 2); terwijl stap\u003e 0 cyclus i \u003d 0; tot nu toe< (Массив.Количество() - Шаг) Цикл j = i; Пока j >\u003d 0 en array [j]\u003e array van de vervangende cyclus \u003d array [j]; Array [j] \u003d array; Array \u003d vervanging; j \u003d j - 1; Als de beeldvormingen vervolgens ingeschakeld worden weergegeven (array); Eindigde; Endcycle; i \u003d I + 1; Endcycle; Stap \u003d Inname (stap / 2); Verwerkingspreservatie (); Endcycle; Een array retourneren; Endfunctie // ---)

8. Algoritme "Snelle sorteren".

Het meest populaire en toegepaste algoritme in de praktijk. Het is een van de meest effectieve algoritmen voor gegevens sorteren.
De hele essentie van het algoritme komt naar beneden om de uitdagende taak uit te breken en ze afzonderlijk op te lossen. Een bepaald referentiepunt is geselecteerd en alle waarden die minder naar links zijn verplaatst, is de rest goed. Vervolgens, voor elk verkregen deel, het uitvoeren van hetzelfde, zolang de onderdelen niet worden verpletterd. Aan het einde krijgen we een aantal gesorteerde onderdelen die u gewoon in 1 geheel wilt lijmen.

// Algoritme "Snelle sorteren" (PROCEDURE B_SORTERY (ARRAY, NIZHNY PELO, UPPORE POIL) I \u003d NIZHNNYPHIPIELD; J \u003d upperfield; M \u003d array [2 ((i + j) / 2)]; terwijl de waarheid de cyclus is terwijl de array [i]< m Цикл i = i + 1; КонецЦикла; Пока Массив[j] > m cyclus j \u003d j - 1; Endcycle; Als I\u003e J dan onderbreekt; Eindigde; Endcycle; Als Nizhnyphield< j Тогда б_Сортировка(Массив,НижнийПредел,j); КонецЕсли; Если i < ВерхнийПредел Тогда б_Сортировка(Массив,i,ВерхнийПредел); КонецЕсли; КонецПроцедуры Функция БыстраяСортировка(Массив) НижняяГраница = 0; ВерхняяГраница = Массив.ВГраница(); б_Сортировка(Массив,НижняяГраница,ВерхняяГраница); Возврат Массив; КонецФункции //---}

9. Klassieke sorteren van een array in 1c.

We zenden een array naar de lijst met waarden. We assorteren de standaard "sorteer" -methode.

// Sorteren op de lijst met waarden (--- de functie van de sorteeracceptatie (tekenarray) van de MSiscznch \u003d Nieuwe lijst van benaderingen; Mspisokznch


Alle sorteren kan worden versneld door de code in cycli in 1 regel te plaatsen. Maar voor leesbaarheid, vertrokken dus.


Geplaatst door verwerking waarin alle bovengenoemde algoritmen worden geïmplementeerd, wordt ook de dynamische animatie van het sorteerproces ondersteund. (Behalve standaard sorteren 1c) .

- Startende verwerking automatisch, de reeks willekeurige nummers van 0 tot 100 dimensies van 100 elementen vormt automatisch.
- Voor het maken van een andere array moet u klikken op de knop "Creëren van HSH MAXIF", u kunt ook het vereiste bereik kiezen.
- Voor opname van dynamische animatie moet worden aangevinkt op "Display sorteren in de diagram". Ik adviseer u op ineffectieve algoritmen om een \u200b\u200bvinkje te installeren met de dimensie van de array tot 100 elementen, anders wacht u op het sorteren :)

Dynamische tekening van het sorteerproces vermindert de prestaties aanzienlijk, maar kan duidelijk zien hoe het algoritme werkt.

Invoering .

Ongeveer drie en een halve decennia zijn gepasseerd sinds de voetstukjes worden geïntroduceerd als een academische discipline-programmering voor computers. Met de enorme snelheid van veranderingen in het onderwerp, was altijd de snelheid van de snelheid van centrale uitgeversmechanismen, speciaal gericht op de pedavische programma's van de boeken niet vaker, dan een keer in een decennium - het is nauwelijks evenredig aan de snelheid van verandering van Generaties van computers. Tegenwoordig zijn de planken van boekwinkels barst van publicaties op de informatica. Echter, de leraar (en de meeste studenten) Speciale trainingsboeken, de inhoud en focus waarvan voldoen aan het opgegeven curriculum en het programma zijn nog steeds erg nodig. Nu worden, naast het programmeren, andere complexere speciale cursussen, op de kruising van toegepaste (discrete) wiskunde en informatica, geïntroduceerd in sommige specialiteiten in voetstukken.

In deze cursus kunt u kennismaken met arrays en leren over de eenvoudige en complexe methoden van hun sortering, evenals waarvan het meest effectief is en in welke gevallen.

1. Sorteer taken.

1.1. Gemeenschappelijke bepalingen.

De hoofdtaak is om verschillende sorteermethoden te demonstreren en het meest effectief van hen toe te wijzen. Sorteren is een vrij goed voorbeeld van een taak die kan worden opgelost met veel verschillende algoritmen. Elk van hen heeft zijn eigen voordelen en hun tekortkomingen en kies het algoritme, op basis van de specifieke instelling van het probleem.

In het algemeen moet het sorteren worden begrepen als het proces van hergroepering van een gegeven set objecten in een specifieke volgorde. Het doel van de soort is om de volgende zoektocht naar items in een dergelijke gesorteerde set te vergemakkelijken. Dit is bijna universele, fundamentele activiteiten. We ontmoeten gesorteerde objecten in telefoonboeken, in inkomstenbelastingen, in de tafels van boeken, in bibliotheken, in woordenboeken, in magazijnen - bijna overal, waar u moet zoeken naar opgeslagen objecten.

Het gesprek over het sorteren is dus behoorlijk passend en belangrijk, als het gaat om gegevensverwerking. De eerste interesse in sortering is gebaseerd op het feit dat bij het bouwen van algoritmen, we vele zeer fundamentele technieken hebben. Er zijn bijna geen methoden die niet moeten voldoen bij het bespreken van deze taak. Sorteren is in het bijzonder het perfecte voorwerp voor de demonstratie van een enorme verscheidenheid aan algoritmen, ze zijn allemaal uitgevonden voor dezelfde taak, veel in zekere zin zijn optimaal, de meerderheid hebben hun voordelen. Daarom is het ook een ideaal object dat de noodzaak om de prestaties van algoritmen te analyseren. Bovendien kan op voorbeelden van sorteren worden getoond, zoals door het algoritme te compliceren, hoewel er al voor de hand liggende methoden zijn, kunt u een aanzienlijke winst bereiken in efficiëntie.

De selectie van het algoritme is afhankelijk van de structuur van de verwerkte gegevens is bijna de wet, maar in het geval van een sorteren is een dergelijke afhankelijkheid zo diep dat de bijbehorende methoden in twee klassen - sorteerarrays en sorteerbestanden (sequenties) braken. Soms worden ze interne en externe sortering genoemd, omdat arrays worden opgeslagen in snel, operationeel, intern geheugen van de machine met willekeurige toegang, en de bestanden worden meestal in een langzamer geplaatst, maar ook meer externe geheugencapacles op apparaten op basis van mechanische verplaatsingen ( schijven of tapes).

, een, ......, en vervolgens sorteren is de permutatie van deze elementen in een AK-array, AK, ..., Akfe AK<= ak <= ….. <= ak.

Wij zijn van mening dat het type item wordt gedefinieerd als een geheel getal.

Constn \u003d ???; // Hier specificeert de gewenste lengte van de array

Var A: array of integer;

De keuze van integer tot op zekere hoogte willekeurig. Het was mogelijk om te nemen en

een ander type waarop de gemeenschappelijke relatie wordt bepaald.

De sorteermethode wordt stabiel genoemd als tijdens het sorteerproces de relatieve locatie van elementen met gelijke sleutels niet verandert. Sorteerstabiliteit is vaak wenselijk als het gaat om elementen die reeds bestelde (gesorteerd) in sommige secundaire sleutels (d.w.z. eigenschappen) die geen invloed hebben op de hoofdsleutel.

1.2. Het instellen van de taak van sorteren van arrays.

Basisvoorwaarde: de geselecteerde methode van sorteerarrays moet economisch het beschikbare geheugen gebruiken. Dit suggereert dat de permutaties die de elementen in orde moeten worden uitgevoerd op dezelfde plaats die wil zeggen, de methoden waarin elementen uit array A worden verzonden naar de resulterende array B aanzienlijk minder belang zijn. We zullen eerst de methoden voor hun economie, d.w.z. classificeren, tegen de tijd van hun werk. Een goede effectiviteit kan C zijn - het aantal sleutelvergelijkingen en M is het aantal doorstuurde (permutaties) van elementen. Deze cijfers zijn de essentie van de functie van N - het aantal gesorteerde elementen. Hoewel goede sorteeralgoritmen de volgorde van n * logn-vergelijkingen vereisen, onderzoeken we eerst verschillende eenvoudige en voor de hand liggende methoden, ze worden direct genoemd, waar N2-toetsenvergelijkingen vereist zijn. Begin analyse van directe methoden, niet de aanraking van snelle algoritmen, we veroorzaken dergelijke redenen:

1. Directe methoden zijn bijzonder handig om de kenmerkende kenmerken van de basisprincipes van de meeste sortering uit te leggen.

2. Programma's van deze methoden zijn gemakkelijk te begrijpen, en ze zijn kort.

3. Volledige methoden vereisen een groot aantal operaties, en daarom zijn voor voldoende kleine N-directe methoden sneller, hoewel het niet mag worden gebruikt om ze te gebruiken.

De methoden voor het sorteren "op dezelfde plaats" kunnen worden verdeeld in overeenstemming met de definiërende principes voor drie hoofdcategorieën:

· Sorteren op inclusie (Byinsertion).

· Sorteren op selectie.

· Sorteren op beurzen (doorhexchange).

Nu verkennen we deze principes en vergelijken we ze. Alle programma's worden bediend door een array a.

Constn \u003d.<длина массива>

a: array ofIteger;

2. Methoden voor het sorteren van arrays.

2.1. Eenvoudige methoden voor het sorteren van arrays.

2.1.1. Sorteer op directe opname.

Deze methode wordt veel gebruikt bij het speelkaarten. Elementen zijn mentaal verdeeld in reeds "ready" -sequentie

, ... en de originele volgorde. Met elke stap, beginnend met I \u003d 2 en toenemende I Elke keer per eenheid, van de initiële sequentie, worden de i- de elementen opgehaald en verschoven in de afgewerkte volgorde, terwijl deze op de gewenste locatie wordt geplaatst.

Programma 2.1. Ondersteuning met behulp van directe opname.

I, J, N, X: Integer;

A: array of integer;

Writeln ('voer de lengte van de array' in ');

Writeln ('ingebouwde');

Voor I: \u003d 1 tot n Lees (A [I]);

Voor i: \u003d 2 to n do

Terwijl X.

Writeln ("resultaat:");

Voor I: \u003d 1 tot n Do Schrijf (A [I], "")

Zo'n typisch geval van een terugkerend proces met twee omstandigheden

het einde stelt ons in staat om te profiteren van een bekende

"Barrière" (Sentinel).

Analyse van de directe inclusie-methode. Het aantal vergelijkingen van toetsen (CI) met de I-M van het gebied is hoogstens gelijk aan I-1, de kleinere - 1; Als we aannemen dat alle permutaties van de toetsen eveneens gelijk zijn, dan is het gemiddelde aantal vergelijkingen I / 2. Het aantal MI-zendingen is gelijk aan CI + 2 (inclusief barrière). Daarom zijn het totale aantal vergelijkingen en het aantal zendingen als volgt:

CMIN \u003d N-1 (2.1.) MMIN \u003d 3 * (N-1) (2.4.)

CAVE \u003d (N2 + N-2) / 4 (2.2.) MAVE \u003d (N2 + 9 * N - 10) / 4 (2.5.)

CMAX \u003d (N2 + N-4) / 4 (2.3.) MMAX \u003d (N2 + 3 * N-4) / 2 (2.6)

Het algoritme met directe insluitsels kan eenvoudig worden verbeterd als u aandacht besteedt aan het feit dat de afgewerkte volgorde waarin u een nieuw element moet invoegen dat al is besteld. Natuurlijk wijd je op een binaire zoekopdracht, waarin een poging wordt gemaakt om te vergelijken met het midden van de voltooide reeks, en dan gaat het divisiesproces in de helft totdat het inclusiepunt wordt gevonden. Een dergelijk gewijzigd sorteeralgoritme wordt binair genoemd, inclusief methode (Binaryinsertion).

Programma 2.2. Sorteer door de methode in de helft te delen.

I, J, M, L, R, X, N: geheel getal;

A: array of integer;

Writeln ("Voer de lengte van de array in");

Writeln ("Voer een array in");

Voor I: \u003d 1 tot n Lees (A [I]);

Voor i: \u003d 2 to n do

X: \u003d a [i]; l: \u003d 1; r: \u003d i;

Als een [M]<=X THEN L:=M+1 ELSE R:=M

Om de code te vereenvoudigen en de leesbaarheid te verbeteren, zullen we de Swap-methode introduceren, die de waarden in de array in de index zal wijzigen.

VOID SWAP (T-items, INT LINKS, INT RECHTS) (IF (LINKS! \u003d RECHTS) (T TEMP \u003d Items; Items \u003d Items; Items \u003d Temp;)

Bubble sorteren

Sorteren op bubble is het eenvoudigste sorteeralgoritme. Het passeert meerdere keren door de array, in elke fase, het verplaatsen van de grootste waarde van de array-niet-gecorrigeerde uiteindelijk.

We hebben bijvoorbeeld een scala aan gehele getallen:

Wanneer je voor het eerst doorloopt door de array, vergelijken we de waarden van 3 en 7. Sinds 7 meer dan 3 verlaten we ze zoals het is. Daarna, vergelijk 7 en 4. 4 minder dan 7, dus wij veranderen ze op plaatsen, het verplaatsen van de zeven naar de ene positie dichter bij het einde van de array. Nu ziet hij er zo uit:

Dit proces wordt herhaald totdat de zeven bijna het einde van de array zullen bereiken. Uiteindelijk wordt het vergeleken met een element 8, dat groter is, en daarom komt de uitwisseling niet op. Nadat we een keer door de array zijn gegaan, ziet het er als volgt uit:

Aangezien er een ten minste ene uitwisseling van waarden was, moeten we weer door de array gaan. Als gevolg van deze passage verplaatsen we het nummer 6 op zijn plaats.

En nogmaals, ten minste één uitwisseling werd gemaakt en daarom gaan we weer door de array.

Bij de volgende passage wordt de uitwisseling niet gemaakt, wat betekent dat onze array wordt gesorteerd en het algoritme heeft zijn werk voltooid.

Openbare ongeldige sorteer (t-items) (BOOL geruild; do (geruild \u003d onwaar; voor (int i \u003d 1; i< items.Length; i++) { if (items.CompareTo(items[i]) > 0) (Swap (items, I - 1, I), geruild \u003d true,))) terwijl (geruild! \u003d False); )

Sorteer inserts

Sorteer door inserts werkt door door de array te gaan en de gewenste waarde naar het begin van de array te verplaatsen. Nadat de volgende positie wordt verwerkt, weten we dat alle posities eraan worden gesorteerd en daarna - nee.

Een belangrijk punt: inserts sorteren verwerkt de elementen van de array in volgorde. Omdat het algoritme door de items van links naar rechts gaat, weten we dat alles wat de linker van de huidige index al is gesorteerd. In deze figuur wordt getoond hoe het gesorteerde deel van de array met elke passage toeneemt:

Het geleidelijk gesorteerd deel van de array groeit, en uiteindelijk zal de array worden besteld.

Laten we een specifiek voorbeeld bekijken. Hier is onze ongezette array die we zullen gebruiken:

Het algoritme begint te werken uit de index 0 en waarde 3. Aangezien dit de eerste index is, is de array inclusief als gesorteerd.

In dit stadium zijn elementen met indexen 0..1 gesorteerd, maar er is niets bekend over elementen met indexen 2..n.

Het volgende is ingecheckte waarde 4. Omdat het minder dan zeven is, moeten we deze overbrengen naar de juiste positie in het gesorteerde deel van de array. De vraag blijft: hoe het te bepalen? Dit wordt uitgevoerd door de FindinsertionIndex-methode. Het vergelijkt de waarde die erop wordt verzonden (4) met elke waarde in het gesorteerde gedeelte totdat deze een plaats vindt om in te voegen.

We hebben dus index 1 gevonden (tussen waarden 3 en 7). De insertemethode wordt ingevoegd door de opslagbare waarde uit de array te verwijderen en alle waarden te verschuiven die beginnen met de index om naar rechts in te voegen. Nu ziet de array er als volgt uit:

Nu een deel van de array, variërend van het nulelement en eindigend met een element met een index 2, gesorteerd. De volgende passage begint met de index 3 en waarden 4. Naarmate het algoritme wordt uitgevoerd, blijven we dergelijke inserts maken.

Wanneer er geen mogelijkheden meer zijn voor inserts, wordt de array als volledig gesorteerd beschouwd, en de werking van het algoritme is voltooid.

Openbare ongeldige sorteren (t-items) (int SortedRangeDindex \u003d 1; terwijl (SortedRangeDindex< items.Length) { if (items.CompareTo(items) < 0) { int insertIndex = FindInsertionIndex(items, items); Insert(items, insertIndex, sortedRangeEndIndex); } sortedRangeEndIndex++; } } private int FindInsertionIndex(T items, T valueToInsert) { for (int index = 0; index < items.Length; index++) { if (items.CompareTo(valueToInsert) > 0) (Return-index;)) Gooi nieuwe InvalidOperationException ("De Insertion Index is niet gevonden"); ) Privé-void insert (t ItemArray, int indexinsertinvingTAt, int indexinsertinvingVROM) (// ItemAray \u003d 0 1 2 4 5 6 3 7 // Insertingat \u003d 3 // InsertingFrom \u003d 6 // // Acties: // 1: Huidige index opslaan In Temp // 2: Vervang indexintentat op indexintentie // 3: Vervang indexintentat op instellingen in positie +1 // Verplaats de elementen naar links naar één. // 4: Record Temp naar positie in de ARRAY + 1. // Stap 1. t Temp \u003d Itemarray; // Stap 2. Itemarray \u003d Itemarray; // Stap 3. Voor (INT CURRUM \u003d INDEXINTERTINGFROM; stroom\u003e Indexintentat; stroom--) (Itemarray \u003d Itemarray;) // Stap 4. Itemarray \u003d Temp ;)

Sorteer naar keuze

Sorteer op keuze is een soort hybride tussen bubble- en sorteerinzetstukken. Als een bubbel-sortering passeert dit algoritme de array per keer door de array, waardoor de ene waarde naar de juiste positie wordt verplaatst. In tegenstelling tot bubble sorteren kiest het echter de kleinste niet-kernwaarde in plaats van de grootste. Net als bij de sorteerinzetstukken bevindt zich een bestelde onderdeel van de array aan het begin, terwijl het in bubble sorteert, is het aan het einde.

Laten we eens kijken naar het werk van sorteren met een keuze op onze niet-gesorteerde array.

Wanneer u het algoritme voor het eerst passeert met behulp van de FindTIDEXOFSMALLSTFROMINDEX-methode, probeert u de kleinste waarde in de array te vinden en naar het begin te verplaatsen.

Met zo'n kleine array kunnen we onmiddellijk zeggen dat de kleinste waarde 3 is, en het is al op de juiste positie. In dit stadium weten we dat in de eerste positie in de array (index 0) de kleinste waarde is, daarom is de opkomst van de array al gesorteerd. Daarom beginnen we de tweede pas - deze keer op indexen van 1 tot N - 1.

In de tweede pas definiëren we dat de kleinste waarde - 4. We veranderen het op plaatsen met het tweede element, zeven, waarna 4 valt op de juiste positie.

Nu begint het ongezouten deel van de array met de index 2. het groeit op één element met elke passage van het algoritme. Als we geen uitwisseling hebben gedaan op elke pass, betekent dit dat de array is gesorteerd.

Na nog twee passen voltooit het algoritme zijn werk:

Openbare ongeldige sorteer (t-items) (INT SORTEEDGANGEND \u003d 0; terwijl (SortedOrbend< items.Length) { int nextIndex = FindIndexOfSmallestFromIndex(items, sortedRangeEnd); Swap(items, sortedRangeEnd, nextIndex); sortedRangeEnd++; } } private int FindIndexOfSmallestFromIndex(T items, int sortedRangeEnd) { T currentSmallest = items; int currentSmallestIndex = sortedRangeEnd; for (int i = sortedRangeEnd + 1; i < items.Length; i++) { if (currentSmallest.CompareTo(items[i]) > 0) (CurrentSmallest \u003d Items [I]; CurrentSmalLTIDEX \u003d I;)) Return CurrentSmalLTIDEX; )

Sorteren samen

Verdeel en heers

Tot nu toe hebben we overwogen lineaire algoritmen. Ze gebruiken weinig extra geheugen, maar hebben kwadratische complexiteit. In het voorbeeld van het sorteren van samenvoeging zullen we kijken naar het algoritme van het type "verdelen en veroveren" (Verdeel en heers).

Algoritmen van dit type werken, het delen van een grote taak voor kleiner, is gemakkelijker op te lossen. We gebruiken ze elke dag. Het zoeken in het telefoonboek is bijvoorbeeld een van de voorbeelden van een dergelijk algoritme.

Als u een persoon op de achternaam Petrov wilt vinden, zoekt u niet, te beginnen met de letter A en draait u om één pagina. Je zult het boek waarschijnlijk ergens in het midden openen. Als u bij de letter t gaat, heeft verschillende pagina's teruggebracht, misschien te veel - tot de letter O. Dan ga je gang. Dus, draaien daar en terug een toenemend aantal pagina's, zult u uiteindelijk de juiste vinden.

Hoe effectief zijn deze algoritmen?

Stel dat dat in de telefoon 1000 pagina's boekt. Als u het in het midden opent, gooit u 500 pagina's uit die geen geschikte persoon hebben. Als u niet op de gewenste pagina bent gekomen, kiest u de rechter of linkerkant en laat u de helft van de beschikbare opties opnieuw achter. Nu moet u 250 pagina's bekijken. Dus verdelen we onze taak opnieuw en opnieuw en kunnen een persoon vinden in het telefoonboek voor slechts 10 keer bekeken. Dit is 1% van het totale aantal pagina's dat we met een lineaire zoekopdracht zouden moeten worden bekeken.

Sorteren samen

Bij het sorteren van de fusie verdelen we de array in de helft tot elke site één element in lengte wordt. Vervolgens worden deze gebieden teruggestuurd naar de plaats (samenvoegen) in de juiste volgorde.

Laten we zo'n array bekijken:

We splitsen het in de helft:

En we zullen elk deel in tweeën delen totdat onderdelen met één element blijven:

Nu we de array verdeelden op de maximale korte secties, voegen we ze in de juiste volgorde samen.

Ten eerste krijgen we groepen van twee gesorteerde elementen, dan "verzamelen ze in groepen van vier elementen en aan het einde verzamelen we alles samen in een gesorteerde array.

Voor de werking van het algoritme moeten we de volgende bewerkingen implementeren:

  1. Bediening voor de recursieve scheiding van de array in groepen (sorteermethode).
  2. Samenvoegen in de juiste volgorde (samenvoegmethode).

Het is de moeite waard om op te merken dat, in tegenstelling tot lineaire sorteeralgoritmen, de samenvoegingssortering een array zal delen en lijsten, ongeacht of het in eerste instantie is gesorteerd of niet. Daarom, ondanks het feit dat het in het ergste geval sneller zal werken dan de lineaire, op zijn best zijn prestaties lager dan die van de lineaire. Daarom is de fusiesortering niet de beste oplossing wanneer het nodig is om een \u200b\u200bgedeeltelijk bestelde array te sorteren.

Openbare ongeldige sorteer (t-items) (items.length<= 1) { return; } int leftSize = items.Length / 2; int rightSize = items.Length - leftSize; T left = new T; T right = new T; Array.Copy(items, 0, left, 0, leftSize); Array.Copy(items, leftSize, right, 0, rightSize); Sort(left); Sort(right); Merge(items, left, right); } private void Merge(T items, T left, T right) { int leftIndex = 0; int rightIndex = 0; int targetIndex = 0; int remaining = left.Length + right.Length; while(remaining > 0) (if (leftIndex\u003e \u003d links.length) (Items \u003d toch;) else if (RightInTEX\u003e \u003d Right.Length) (Items \u003d Left;) anders als (linker.compareto (rechts)< 0) { items = left; } else { items = right; } targetIndex++; remaining--; } }

Snelle sorteren

Snelle sortering is een ander "verdelen en veroveren" algoritme. Het werkt, recursief herhaalt de volgende stappen:

  1. Selecteer de sleutelindex en deel een array over in twee delen. Dit kan op verschillende manieren worden gedaan, maar in dit artikel gebruiken we een willekeurig nummer.
  2. Verplaats alle elementen meer sleutel naar de rechterkant van de array en alle elementen zijn kleiner dan de sleutel aan de linkerkant. Nu staat het sleutelelement in de juiste positie - het is groter dan elk element aan de linkerkant en minder dan elk element aan de rechterkant.
  3. We herhalen de eerste twee stappen totdat de array volledig is gesorteerd.

Laten we eens kijken naar het werk van het algoritme in de volgende array:

Ten eerste selecteren we willekeurig het sleutel item:

INT PIVOTIDEX \u003d _PIVOTRNG.NEXT (LINKS, RECHTS);

Nu, wanneer we de sleutelindex (4) kennen, nemen we de waarde in deze index (6) en draagt \u200b\u200bwe waarden in de array zodat alle nummers meer of gelijk zijn aan de toets naar het juiste gedeelte, en alle nummers zijn kleiner in de linkerkant. Houd er rekening mee dat in het proces van overdrachtswaarden de sleutelelementindex kan veranderen (we zullen het kort zien).

Bewegende waarden worden uitgevoerd door partitie.

In dit stadium weten we dat de waarde van 6 op de juiste positie staat. Nu herhalen we dit proces voor de rechter- en linkeronderdelen van de array.

We hebben één ongezette waarde, en aangezien we weten dat al het andere al gesorteerd is, completeert het algoritme het werk.

Willekeurig _pivotrng \u003d nieuw willekeurig (); Public Void Sorteer (T-items) (QuickSorth - 1);) Private Void Quicksort (T-items, INT LINKER, INT RECHTS) (IF< right) { int pivotIndex = _pivotRng.Next(left, right); int newPivot = partition(items, left, right, pivotIndex); quicksort(items, left, newPivot - 1); quicksort(items, newPivot + 1, right); } } private int partition(T items, int left, int right, int pivotIndex) { T pivotValue = items; Swap(items, pivotIndex, right); int storeIndex = left; for (int i = left; i < right; i++) { if (items[i].CompareTo(pivotValue) < 0) { Swap(items, i, storeIndex); storeIndex += 1; } } Swap(items, storeIndex, right); return storeIndex; }

Conclusie

Hierover eindigen we onze cyclus van artikelen over algoritmen en datastructuren voor beginners. Gedurende deze tijd overwogen we verbonden lijsten, dynamische arrays, een binaire zoekboom en sets met voorbeelden van code op C #.

Er zijn drie algemene methoden voor het sorteren van arrays:

  • Uitwisseling
  • Selectie (monster)
  • Invoegen

Om te begrijpen hoe deze methoden werken, stel je een dek van speelkaarten voor. Om de kaarten te sorteren op de methode uitwisseling , verspreid ze op de tafel en verander de kaart op sommige plaatsen, niet in volgorde totdat het hele deck is besteld.

In de methode keuze verspreid de kaarten op de tafel, selecteer de kaart van de kleinste betekenis en plaats het in uw hand. Selecteer vervolgens vanaf de resterende kaarten de kaart van de kleinste betekenis en zet het op die al in uw hand is. Het proces wordt herhaald totdat alle kaarten in de hand zijn; Aan het einde van het proces van het dek zal worden gesorteerd.

Om een \u200b\u200bdek te sorteren met invoegen , Neem alle kaarten in je hand. Leg ze op één op de tafel en voeg elke volgende kaart in de juiste positie in. Wanneer alle kaarten op tafel liggen, wordt het dek gesorteerd.

Sorteer inserts

Sorteer inserts - Eenvoudig sorteren algoritme. Hoewel dit algoritme inferieur is in efficiëntie ingewikkelder (zoals snelle sortering), heeft hij een aantal voordelen:

· Effectief op kleine gegevenssets, kunnen op gegevenssets tot dozijn elementen de beste zijn;

· Effectief op gegevenssets die al gedeeltelijk gesorteerd zijn;

· Dit is een stabiel sorteeralgoritme (verandert de volgorde van de elementen die al is gesorteerd);

· Kan de lijst sorteren zoals het ontvangt;

Minus - hoge complexiteit van het algoritme: O ( n.²)

Over het algemeen zijn de inserts in de ergste gevallen net zo slecht als bubbel sorteren en sorteren naar keuze, en gemiddeld is het slechts een beetje beter.

Omschrijving

Bij elke stap van het algoritme selecteren we een van de elementen van de invoergegevens en plaatst u deze in de gewenste positie in de reeds gesorteerde lijst, totdat de ingangsreeks uitgeput is. De methode om het volgende element uit de bronarray te selecteren is willekeurig; Bijna een keuze-algoritme kan worden gebruikt. Meestal (en om een \u200b\u200bduurzaam sorteeralgoritme te verkrijgen), worden de elementen ingevoegd om in de ingangsarray te verschijnen.

Analyse van het algoritme

De uitvoeringstijd van het algoritme is afhankelijk van de invoergegevens: hoe groter de set die u moet sorteren, hoe meer sorteren wordt uitgevoerd. Ook beïnvloedt op het moment van uitvoering de eerste volgorde van array. Dus het beste geval is een gesorteerde array, en het ergste is een array gesorteerd in de omgekeerde volgorde. De temporele complexiteit van het algoritme bij de slechtste versie van de invoergegevens is θ (n²).

Verkoop op Java.

openbare leegte. Toevoegen () (

voor (Node Cur \u003d First.Next; CUR! \u003d nUL; Cur \u003d cur.next) (

Knooppunt n \u003d cur.prev;

Object val \u003d cur.value;

voor (; n! \u003d nUL; n \u003d n.Prev) (

als. (((Vergelijkbaar) n.value). ComPareto (Val) > 0) {

n.next.value \u003d n.value;

} aNDERS. {

als. (N! \u003d nUL) {

n.next.value \u003d Val;

} aNDERS. {

first.value \u003d val;

Ten eerste sorteert hij de eerste twee elementen. Vervolgens voegt het algoritme het derde element in op de overeenkomstige positie in relatie tot de eerste twee items. Daarna voegt het het vierde element in op de lijst met drie elementen. Dit proces wordt herhaald totdat alle elementen zijn ingebracht. bijvoorbeeldBij het sorteren van de array dcab Elke passage van het algoritme zal er als volgt uitzien:

Begin d c a b

Pass 1. c d a b

Pass 2. een C D B

Pass 3. een b c d

Sorteer naar keuze

Omschrijving

Bij het sorteren van de array wordt het element geselecteerd met de kleinste waarde en uitwisselingen met het eerste element. Dan van de resterende n. - 1 elementen worden opnieuw geselecteerd element met de kleinste sleutel en uitwisselingen met het tweede element, enz. Deze uitwisselingen gaan door naar de laatste twee elementen. bijvoorbeeldAls u de wijze van keuze toepast op de array dcab, elke pas ziet er als volgt uit:

Start D C A BP-aanpak 1 A C D BADGET 2 A B D-code 3 A B C D

Analyse

Helaas, zoals in bubble sorteren, wordt de externe cyclus uitgevoerd n. - 1 keer en intern - gemiddeld n./2 keer. Bijgevolg vereist het sorteren per selectie 1/2(n. 2 -n.) vergelijkingen. Het is dus een procedure-algoritme n. 2, daarom wordt het beschouwd als te traag om een \u200b\u200bgroot aantal elementen te sorteren. Ondanks het feit dat het aantal vergelijkingen in bubble sortering en sorteren door hetzelfde te kiezen, in de laatste hoeveelheid uitwisselingen in de gemiddelde zaak veel kleiner is dan in bubble sorteren.

Verkoop op Java.

openbare leegte. Selectort () (

voor (NODE A \u003d EERSTE, A! \u003d LAATSTE, A \u003d A.NEXT) (

Knooppunt min \u003d laatste;

voor (Knooppunt B \u003d A; B! \u003d Laatste; b \u003d b.volgende) (

als. (((Vergelijkbaar) B.Val). ComPareto (Min.val) < 0) {

a.VAL \u003d MIN.VAL;

Sorteer uitwisseling

Het beroemdste algoritme - bubble sorteren. De populariteit wordt verklaard door de interessante naam en eenvoud van het algoritme zelf. Niettemin is dit in het algemeen een van de slechtste sorteeralgoritmen.

Bubble sortering verwijst naar de klasse van uitwisselingssortering, d.w.z. Naar de klasse van sorteren door te delen. Het algoritme bevat herhaalde vergelijkingen (d.w.z. meerdere vergelijkingen van dezelfde elementen) en, indien nodig, de uitwisseling van aangrenzende elementen. Elementen gedragen zich als luchtbellen in water - elk van hen stijgt naar zijn niveau.

Om visueel te laten zien hoe bubble sorteren werkt, neem aan dat de bronarray elementen bevat dcab. Hieronder staat de toestand van de array na elke passage:

Begin d c a b

Pass 1. een d c b

Pass 2. een b d c

Pass 3. een b c d

Bij het analyseren van een sorteeralgoritme is het nuttig om te weten hoeveel vergelijking en uitwisselingsoperaties in het beste, gemiddeld en slechtst worden uitgevoerd. Aangezien de kenmerken van de uitgevoerde code afhangen van dergelijke factoren als de optimalisatie die door de compiler wordt geproduceerd, zullen we de verschillen tussen de processors en de kenmerken van de implementatie niet proberen de exacte waarden van deze parameters te verkrijgen. In plaats daarvan concentreren we onze aandacht op de algehele effectiviteit van elk algoritme.

In bubble sortering is het bedrag van vergelijkingen altijd hetzelfde, omdat twee voor cycli worden herhaaldelijk getal van keren herhaald, ongeacht of de lijst oorspronkelijk is besteld of niet. Dit betekent dat het bubbel sorteeralgoritme altijd uitvoert

(n. 2 -n.)/2

vergelijkingen, waar n. - aantal gesorteerde elementen. Deze formule is afgeleid op het terrein dat de externe cyclus wordt uitgevoerd n. - 1 keer, en het interne wordt gemiddeld uitgevoerd n./2 keer. Het product van deze waarden en geeft de vorige uitdrukking.

Let op leden n. 2 in de formule. Er wordt gezegd dat bubble sortering een procedure-algoritme is n. 2, aangezien de uitvoeringstijd evenredig is met het kwadraat van het aantal gesorteerde elementen. Het moet worden erkend dat het algoritme van orde n. 2 is niet effectief met een groot aantal elementen, aangezien de uitvoeringstijd exponentieel groeit, afhankelijk van het aantal gesorteerde elementen.

In het algoritme van bubble sorteren is de hoeveelheid uitwisselingen op zijn best nul als de array al is gesorteerd. Gemiddeld en slechtste gevallen is het aantal uitwisselingen echter ook een grootte van de bestelling n. 2 .


Vergelijkbare informatie.