Heapsort Tidskompleksitet

Heapsort Tidskompleksitet



Heap Sort, skrevet som Heapsort, er en slags sorteringsalgoritme. Den tager en liste, der er delvist bestilt, og producerer en sorteret liste ud fra den. Sortering kan være stigende eller faldende. I denne artikel er sorteringen stigende. Bemærk, at heapsort ikke sorterer en ufuldstændig usorteret liste. Den sorterer en delvist ordnet (sorteret) liste. Den delvist ordnede liste er en bunke. I denne artikel er den betragtede bunke den mindste (stigende) bunke.

En bunke omtales som 'delvis ordnet' og ikke 'delvist sorteret'. Ordet 'sortering' betyder fuldstændig bestilling (fuldstændig sortering). En bunke er ikke delvist ordnet vilkårligt. En bunke er delvist ordnet efter et kriterium (mønster), som vist nedenfor.

Så heapsort består af to trin: opbygning af heapen og udtrækning af det bestilte element fra toppen af ​​heapen. I anden fase, efter hver ekstraktion, genopbygges dyngen. Hver ombygning er hurtigere end den oprindelige byggeproces, da ombygningen udføres fra en tidligere bygning, hvor et element er blevet fjernet. Og dermed sorterer heapsort en fuldstændig usorteret liste.







Formålet med denne artikel er kort at forklare heapsort og derefter producere dens tidskompleksitet (se betydningen af ​​tidskompleksitet nedenfor). Mod slutningen sker kodningen i C++.



Minimum bunke

En bunke kan være en minimal bunke eller en maksimal bunke. En max-heap er en, hvor det første element er det højeste element, og hele træet eller den tilsvarende liste er delvist ordnet i faldende rækkefølge. En min-heap er en, hvor det første element er det mindste element, og hele listen er delvist ordnet i stigende rækkefølge. I denne artikel er kun minimumsbunken taget i betragtning. Bemærk: i emnet for heapen kaldes et element også en node.



En bunke er et komplet binært træ. Det binære træ kan udtrykkes som en matrix (liste); læses fra top til bund og fra venstre mod højre. Heap-egenskaben for en min-heap er, at en overordnet node er mindre end eller lig med hver af dens to børn. Et eksempel på en uordnet liste er:





9 19 24 5 3 elleve 14 22 7 6 17 femten nul nul nul
0 1 to 3 4 5 6 7 8 9 10 elleve 12 13 14

Den første række i denne tabel er elementerne i arrayet. I anden række er de nul-baserede indekser. Denne liste over elementer kan udtrykkes som et træ. Null-elementerne er blevet tilføjet for at lave et fuldt binært træ. Strengt taget er null-elementerne ikke en del af listen (træet). Denne liste har ingen rækkefølge, så den er ikke en bunke endnu. Det bliver til en bunke, når den har fået delbestilling, ifølge bunkeejendommen.

Forholdet mellem noder og indekser

Husk, at en heap er et komplet binært træ, før den har heap-konfigurationen (heap-egenskab). Den tidligere liste er endnu ikke en bunke, fordi elementerne ikke adlyder heap-egenskaben. Det bliver en heap efter at have omarrangeret elementer i delvis rækkefølge i henhold til min-heap-egenskaben. Delvis rækkefølge kan ses som delvis sortering (selvom ordet 'sortering' betyder fuldstændig rækkefølge).



Uanset om et binært træ er en bunke eller ej, har hver forælder to børn, undtagen bladknuderne (sidste). Der er en matematisk sammenhæng mellem indeksene mellem hver forælder og dens børn. Det er som følger: Hvis forælderen er ved indeks i, så er det venstre barn ved indeks:

to * jeg + 1

og det rigtige barn er på indekset:

to * jeg + to

Dette er til nul-baseret indeksering. Og så har en forælder ved indeks 0 sit venstre barn ved indeks 2×0+1=1 og dets højre barn ved 2×0+2=2. En forælder ved indeks 1 har sit venstre barn ved indeks 2×1+1=3 og højre barn ved indeks 2×1+2=4; og så videre.

Ved min-heap-egenskaben er en forælder ved i mindre end eller lig med venstre barn ved 2i+1 og mindre end eller lig med højre barn ved 2i+2.

Dynge

Heapifying betyder at bygge en heap. Det betyder at omarrangere elementerne i en liste (eller tilsvarende træ), så de opfylder heap-egenskaben. I slutningen af ​​ophobningsprocessen er listen eller træet en hob.

Hvis den tidligere usorterede liste er ophobet, bliver den:

3 5 elleve 7 6 femten 14 22 9 19 17 24 nul nul nul
0 1 to 3 4 5 6 7 8 9 10 elleve 12 13 14

Bemærk: der er 12 elementer og ikke 15 på listen. I anden række er indekserne. I bunkebygningsprocessen skulle elementer kontrolleres, og nogle byttes.

Bemærk, at det mindste og første element er 3. Resten af ​​elementerne følger efter på en stigende, men bølgende måde. Hvis venstre og højre børn i position 2i+1 og 2i+2 hver især er større end eller lig med forælderen ved i, så er dette en min-heap. Dette er ikke fuld bestilling eller sortering. Dette er delvis bestilling, ifølge bunkeejendommen. Det er herfra, at den næste fase for bunkesortering starter.

Heapify Tidskompleksitet

Tidskompleksitet er den relative køretid for en eller anden kode. Det kan ses som antallet af hovedoperationer, som den kode skal fuldføre. Der er forskellige algoritmer til heap building. De mest effektive og hurtigste deler løbende listen med to, kontrollerer elementerne fra bunden og laver derefter nogle udskiftninger af elementer. Lad N være antallet af praktiske elementer i listen. Med denne algoritme er det maksimale antal hovedoperationer (swapping) N. Tidskompleksiteten for heapifying er tidligere givet som:

O ( n )

Hvor n er N og er det maksimalt mulige antal hovedoperationer. Denne notation kaldes Big-O notationen. Det begynder med O i store bogstaver efterfulgt af parenteser. Inde i parentesen er udtrykket for det mulige højeste antal operationer.

Husk: addition kan blive multiplikation, hvis det samme, der tilføjes, bliver ved med at gentages.

Heapsort Illustration

Den tidligere usorterede liste vil blive brugt til at illustrere heapsort. Den givne liste er:

9 19 24 5 3 elleve 14 22 7 6 17 femten

Min-bunken produceret fra listen er:

3 5 elleve 7 6 femten 14 22 9 19 17 24

Det første trin i heapsort er at producere den bunke, der er blevet produceret. Dette er en delvist ordnet liste. Det er ikke en sorteret (fuldstændig sorteret) liste.

Det andet trin består i at fjerne det mindste element, som er det første element, fra heapen, at genophobe den resterende bunke og fjerne de mindste elementer i resultaterne. Det mindste element er altid det første element i den re-heapified heap. Elementerne fjernes og smides ikke væk. De kan sendes til et andet array i den rækkefølge, de fjernes i.

I sidste ende ville det nye array have alle elementerne sorteret (helt), i stigende rækkefølge; og ikke længere kun delvist bestilt.

I anden fase er den første ting at gøre at fjerne 3 og placere den i det nye array. Resultaterne er:

3

og

5 elleve 7 6 femten 14 22 9 19 17 24

De resterende elementer skal ophobes, før det første element udtrækkes. Bunken af ​​de resterende elementer kan blive:

5 6 7 9 femten 14 22 elleve 19 17 24

Udtræk 5 og tilføjelse til den nye liste (array) giver resultaterne:

3 5

og

6 7 9 femten 14 22 elleve 19 17 24

At ophobe det resterende sæt ville give:

6 7 9 femten 14 22 elleve 19 17 24

Udtræk 6 og tilføjelse til den nye liste (array) giver resultaterne:

3 5 6

og

7 9 femten 14 22 elleve 19 17 24

At ophobe det resterende sæt ville give:

7 9 elleve 14 22 femten 19 17 24

Udtræk 7 og tilføjer det til den nye liste giver resultaterne:

3 5 6 7

og

9 elleve 14 22 femten 19 17 24

Ophopning af det resterende sæt giver:

9 elleve 14 22 femten 19 17 24

Udtræk 9 og tilføjelse til den nye liste giver resultaterne:

3 5 6 7 9

og

elleve 14 22 femten 19 17 24

Ophopning af det resterende sæt giver:

elleve 14 17 femten 19 22 24

Udtræk 11 og tilføjer det til den nye liste giver resultaterne:

3 5 6 7 9 elleve

og

14 17 femten 19 22 24

At ophobe det resterende sæt ville give:

14 17 femten 19 22 24

Udtræk 14 og tilføjer dem til den nye liste giver resultaterne:

3 5 6 7 9 elleve 14

og

17 femten 19 22 24

At ophobe det resterende sæt ville give:

femten 17 19 22 24

Udtræk 15 og tilføjer dem til den nye liste giver resultaterne:

3 5 6 7 9 elleve 14 femten

og

17 19 22 24

At ophobe det resterende sæt ville give:

17 19 22 24

Udtræk 17 og tilføjer dem til den nye liste giver resultaterne:

3 5 6 7 9 elleve 14 femten 17

og

19 22 24

At ophobe det resterende sæt ville give:

19 22 24

Ved at udtrække 19 og tilføje dem til den nye liste får du resultaterne:

3 5 6 7 9 elleve 14 femten 17 19

og

22 24

Ophopning af det resterende sæt giver:

22 24

Udtræk 22 og tilføjer dem til den nye liste giver resultaterne:

3 5 6 7 9 elleve 14 femten 17 19 22

og

24

Ophopning af det resterende sæt giver:

24

Udtræk 24 og tilføjer dem til den nye liste giver resultaterne:

3 5 6 7 9 elleve 14 femten 17 19 22 24

og

- - -

Heap-arrayet er nu tomt. Alle de elementer, den havde i begyndelsen, er nu i det nye array (liste) og sorteret.

Heapsort-algoritme

Selvom læseren måske har læst i lærebøger, at heapsort består af to faser, kan heapsort stadig ses som bestående af et trin, som iterativt formindsker det givne array. Med det er algoritmen til at sortere med heapsort som følger:

  • Opfyld den usorterede liste.
  • Udpak det første element af heapen og sæt det som det første element i den nye liste.
  • Opfyld den resterende liste.
  • Udpak det første element i den nye bunke og sæt det som det næste element i den nye liste.
  • Gentag de foregående trin i rækkefølge, indtil bunkelisten er tom. Til sidst sorteres den nye liste.

Heapsort Tidskompleksitet Egentlig

En-trins tilgangen bruges til at bestemme tidskompleksiteten for heapsort. Antag, at der er 8 usorterede elementer, der skal sorteres.

Det mulige maksimale antal operationer for at heapify 8 elementer er 8 .
Det muligt maksimalt antal operationer for at samle de resterende 7 elementer er 7 .
Det muligt maksimalt antal operationer for at samle de resterende 6 elementer er 6 .
Det muligt maksimalt antal operationer for at samle de resterende 5 elementer er 5 .
Det muligt maksimalt antal operationer for at samle de resterende 4 elementer er 4 .
Det muligt maksimalt antal operationer for at samle de resterende 3 elementer er 3 .
Det muligt maksimalt antal operationer for at samle de resterende to elementer er to .
Det muligt maksimalt antal operationer for at samle de resterende 1 element er 1 .

Det mulige maksimale antal operationer er:

8 + 7 + 6 + 5 + 4 + 3 + to + 1 = 36

Gennemsnittet af disse antal operationer er:

36 / 8 = 4.5

Bemærk, at de sidste fire dynger i den foregående illustration ikke ændrede sig, da det første element blev fjernet. Nogle af de tidligere dynger ændrede sig ikke også, da det første element blev fjernet. Med det er et bedre gennemsnitligt antal hovedoperationer (swappings) 3 og ikke 4,5. Så et bedre samlet gennemsnitligt antal hovedoperationer er:

24 = 8 x 3
=> 24 = 8 x log < sub > to < / sub > 8

siden log to 8 = 3.

Generelt er den gennemsnitlige sagstidskompleksitet for heapsort:

O ( n. log2n )

Hvor prikken betyder multiplikation og n er N, det samlede antal elementer på listen (enten af ​​listen).

Bemærk, at operationen med at udtrække det første element er blevet ignoreret. Med hensyn til emnet Tidskompleksitet ignoreres operationer, der tager relativt kort tid.

Kodning i C++

I algoritmebiblioteket i C++ er der en make_heap() funktion. Syntaksen er:

skabelon < klasse RandomAccessIterator, klasse Sammenligne >
constexpr ugyldig make_heap ( RandomAccessIterator først, RandomAccessIterator sidst, Sammenlign comp ) ;

Det tager iteratoren, der peger på det første element i en vektor som dets første argument, og derefter iteratoren, der peger lige ud over slutningen af ​​vektoren som dets sidste argument. For den tidligere usorterede liste ville syntaksen blive brugt som følger for at opnå en minimumsbunke:

vektor < int > vtr = { 9 , 19 , 24 , 5 , 3 , elleve , 14 , 22 , 7 , 6 , 17 , femten } ;
vektor < int > :: iterator iterB = vtr. begynde ( ) ;
vektor < int > :: iterator iterE = vtr. ende ( ) ;
make_heap ( iterB, iterE, større < int > ( ) ) ;

Denne kode ændrer et vektorindhold til en minimal heap-konfiguration. I de følgende C++ vektorer vil to vektorer blive brugt i stedet for to arrays.

For at kopiere og returnere det første element i en vektor skal du bruge vektorsyntaksen:

constexpr referencefront ( ) ;

For at fjerne det første element i en vektor og smide det væk, skal du bruge vektorsyntaksen:

constexpr iterator sletning ( const_iterator position )

For at tilføje et element bagerst i en vektor (næste element), skal du bruge vektorsyntaksen:

constexpr ugyldig skub tilbage ( konst T & x ) ;

Starten på programmet er:

#include
#include
#inkluder
ved brug af navneområde std ;

Algoritme- og vektorbibliotekerne er inkluderet. Næste i programmet er heapsort()-funktionen, som er:

ugyldig heapsort ( vektor < int > & oldV, vektor < int > & nyV ) {
hvis ( gammelV. størrelse ( ) > 0 ) {
vektor < int > :: iterator iterB = gammelV. begynde ( ) ;
vektor < int > :: iterator iterE = gammelV. ende ( ) ;
make_heap ( iterB, iterE, større < int > ( ) ) ;

int Næste = gammelV. foran ( ) ;
gammelV. slette ( iterB ) ;
nyV. skub tilbage ( Næste ) ;
heapsort ( gammelV, nyV ) ;
}
}

Det er en rekursiv funktion. Den bruger make_heap()-funktionen i C++-algoritmebiblioteket. Det andet kodesegment i funktionsdefinitionen udtrækker det første element fra den gamle vektor efter bunkebygningen og tilføjer som det næste element for den nye vektor. Bemærk, at i funktionsdefinitionen er vektorparametrene referencer, mens funktionen kaldes med identifikatorerne (navnene).

En passende C++ hovedfunktion til dette er:

int vigtigste ( int argc, char ** argv )
{
vektor < int > gammelV = { 9 , 19 , 24 , 5 , 3 , elleve , 14 , 22 , 7 , 6 , 17 , femten } ;
vektor < int > nyV ;
heapsort ( gammelV, nyV ) ;

til ( int jeg = 0 ; jeg < nyV. størrelse ( ) ; jeg ++ ) {
cout << nyV [ jeg ] << ' ' ;
}
cout << endl ;

Vend tilbage 0 ;
}

Udgangen er:

3 5 6 7 9 elleve 14 femten 17 19 22 24

sorteret (helt).

Konklusion

Artiklen diskuterede i detaljer arten og funktionen af ​​Heap Sort, almindeligvis kendt som Heapsort, som en sorteringsalgoritme. Heapify Time Complexity, Heapsort-illustration og Heapsort som en algoritme blev dækket og understøttet af eksempler. Den gennemsnitlige tidskompleksitet for et velskrevet heapsort-program er O(nlog(n))