Azərbaycan  AzərbaycanDeutschland  DeutschlandLietuva  LietuvaMalta  Maltaශ්‍රී ලංකාව  ශ්‍රී ලංකාවTürkmenistan  TürkmenistanTürkiyə  TürkiyəУкраина  Украина
Pagalba
www.datawiki.lt-lt.nina.az
  • Pradžia

AlgoritmasTipas Rikiavimo algoritmaiPavadinimas Krūvos HeapSort Sudėtingumas Vidutinis O nlog n displaystyle O n log n b

Krūvos rikiavimo algoritmas

  • Pagrindinis puslapis
  • Krūvos rikiavimo algoritmas
Krūvos rikiavimo algoritmas
www.datawiki.lt-lt.nina.azhttps://www.datawiki.lt-lt.nina.az
Algoritmas
Tipas Rikiavimo algoritmai
Pavadinimas Krūvos (HeapSort)
Sudėtingumas Vidutinis - O(nlog⁡n){\displaystyle O(n\log n)}; blogiausias - O(nlog⁡n){\displaystyle O(n\log n)}
Greitos nuorodos
  • Algoritmai
    • Rikiavimo algoritmai
      • Krūvos
  • Šablonas

Krūvos rikiavimo algoritmas (angl. heapsort) – rikiavimo algoritmas, kai rikiuojama duomenis sukeliant į krūvos (piramidinę) struktūrą.

Apibendrintas algoritmas

  1. Sudaroma Krūvos duomenų struktūra
  2. Iteraciškai iš sudarytos krūvos pašalinamos šaknys. Jas išsaugome mum reikiama tvarka: pvz., realizuojant masyvu, galime ją įrašyti į masyvo gale atsilaisvinusią vietą (pašalinus šaknį ji yra pakeičiama mažiausiu krūvos lapu).

Gauta šaknų seka yra surikiuota.

Krūvos sudarymas

Tarkim, turime duomenų masyvą:

{a1,a2,...,an}{\displaystyle \{a_{1},a_{2},...,a_{n}\}} 

Pirmiausia sukeiskime jo elementus vietomis, kad gautume:

{a1′,a2′,...,an′}{\displaystyle \{a_{1}',a_{2}',...,a_{n}'\}} kur ai′>=a2i′{\displaystyle a_{i}'>=a_{2i}'} ir ai′>=a2i+1{\displaystyle a_{i}'>=a_{2i}+1} 

Grafiškai tai atrodys kaip dvejetainis medis, kurio kiekvienos viršūnės sūnūs yra ne didesni už tėvus.

Tarkime, turime pradinius duomenis {6,4,8,7,3,9,1,2}{\displaystyle \{6,4,8,7,3,9,1,2\}}. Masyvo elementų skaičius n=8{\displaystyle n=8}. Pradėsime nuo pradinio elemento i=n/2=4{\displaystyle i=n/2=4}.

Elementų perkėlimas bus vykdomas taip:

i=4{\displaystyle i=4}

6 4 8 7 3 9 1 2 ^ ^ 

i=3{\displaystyle i=3}

6 4 8 7 3 9 1 2 ^ ^ ^ | | <-----> 6 4 9 7 3 8 1 2 

i=2{\displaystyle i=2}

6 4 9 7 3 8 1 2 ^ ^ ^ | | <---> 6 7 9 4 3 8 1 2 

i=1{\displaystyle i=1}

6 7 9 4 3 8 1 2 ^ ^ ^ | | <---> 9 7 6 4 3 8 1 2 ^ ^ ^ | | <-----> 9 7 8 4 3 6 1 2 


Taigi gavome {9,7,8,4,3,6,1,2}{\displaystyle \{9,7,8,4,3,6,1,2\}}. Šiame masyve jau tenkinama mūsų minėta sąlyga.

Tokia duomenų struktūra vadinama Krūva. Pirma algoritmo dalis būtent ir buvo krūvos sudarymas.

Antroji algoritmo dalis yra pats rikiavimas. Eilinėje iteracijoje imama krūvos viršūnė ir sukeičiama vietomis su paskutiniu masyvo elementu. Kadangi krūvos viršūnėje visada bus didžiausias elementas, tai jį sukeitę vietomis su paskutiniu masyvo elementu, žinosime, kad didžiausias masyvo elementas yra jo paskutinėje pozicijoje. Taip sukeitę elementus vietomis, turime atkurti krūvą. Tai padaryti paprasta, nes vietą pakeitęs būna tik vienas elementas (jis atsiduria viršūnėje). Šį elementą, jei jis nėra didžiausias, reikia perstumti keletu lygių žemiau, kol vėl gausime krūvą. Tai atlikę, pradedame naująją iteraciją, tik šį kartą jau nagrinėsime vienetu trumpesnį masyvą, nes didžiausias elementas, kuris anksčiau buvo viršūnėje, jau atsidūrė savo vietoje ir jo nagrinėti nereikia. Tokių iteracijų skaičius yra N−2{\displaystyle N-2}.

Krūvos aukštis gali būti rastas formule ⌈log2⁡n+1⌉{\displaystyle \lceil \log _{2}{n+1}\rceil }.

Algoritmo savybės

Šis rikiavimo algoritmas nėra stabilus. Pirmoje algoritmo dalyje nereikės atlikti daugiau nei 2n−4{\displaystyle 2n-4} palyginimų, taigi pirmosios dalies sudėtingumas tiesinis. Antrojoje dalyje pirmasis medžio elementas sukeičiamas su paskutiniu vietomis ir atkuriama krūva. Atkuriant krūvą, elementą blogiausiu atveju gali tekti perkelti iš viršūnės į apatinį lygį, o, kaip minėta, medžio lygių skaičius randamas ⌈log2⁡n+1⌉{\displaystyle \lceil \log _{2}{n+1}\rceil } (arba [log2⁡n+1]{\displaystyle [\log _{2}{n+1}]}, jei tartume kad viršūnė yra 0{\displaystyle 0} lygyje). Taigi antroji lemiama algoritmo dalis yra O(nlog⁡n){\displaystyle O(n\log n)} sudėtingumo. Būtent tokio sudėtingumo ir yra algoritmas. Joks rikiavimo algoritmas, naudojantis palyginimus, negali turėti mažesnio sudėtingumo, tačiau bendru atveju už jį greitesnis yra greitasis rikiavimo algoritmas. Priešingai nei rikiavimo suliejimu, kurio sudėtingumas taip pat toks pats, šiam metodui nereikia papildomos atminties.

Rikiavimo medis gali būti naudojamas kaip prioritetų eilė.

Pavyzdžiai

  • Algoritmo Java kalba
public class Pavyzdys { ... private int[] duomenys; private final int ilgis; ... private void perstatyti(int i, int j) { if (i <= j/2) { int k1 = 2 * i; int k2 = 2 * i + 1; if (k2 > j) { k2 = k1; }  int k; if (duomenys[k1-1] > duomenys[k2-1]){ k = k1; } else { k = k2; }  if (duomenys[i-1] < duomenys[k-1]) { int laikinas = duomenys[i-1]; duomenys[i-1] = duomenys[k-1]; duomenys[k-1] = laikinas; perstatyti(k, j); } } }  private void sudarytiRusiavimoMedi() { for (int i = ilgis/2; i >= 1; i--) { perstatyti(i, ilgis); } }  private void rusiuotiKruvosMetodu() { sudarytiRusiavimoMedi(); for (int i = ilgis; i >= 2; i--) { int laikinas = duomenys[0]; duomenys[0] = duomenys[i-1]; duomenys[i-1] = laikinas; perstatyti(1, i-1); } } ... } 

Nuorodos

  • http://www2.hawaii.edu/~copley/665/HSApplet.html Archyvuota kopija 2009-01-19 iš Wayback Machine projekto. (spauskite mygtuką iš dešinės)
  • http://www.sig.lt/linas/teaching/ad2005/dw/lib/exe/fetch.php?cache=cache&media=lectures%3A5_1p.pdf[neveikianti nuoroda]
  • Heapsort code

Autorius: www.NiNa.Az

Išleidimo data: 26 Lie, 2025 / 04:17

vikipedija, wiki, lietuvos, knyga, knygos, biblioteka, straipsnis, skaityti, atsisiųsti, nemokamai atsisiųsti, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, pictu, mobilusis, porn, telefonas, android, iOS, apple, mobile telefl, samsung, iPhone, xiomi, xiaomi, redmi, pornografija, honor, oppo, Nokia, Sonya, mi, pc, web, kompiuteris, Informacija apie Krūvos rikiavimo algoritmas, Kas yra Krūvos rikiavimo algoritmas? Ką reiškia Krūvos rikiavimo algoritmas?

AlgoritmasTipas Rikiavimo algoritmaiPavadinimas Kruvos HeapSort Sudetingumas Vidutinis O nlog n displaystyle O n log n blogiausias O nlog n displaystyle O n log n Greitos nuorodos Algoritmai Rikiavimo algoritmai Kruvos Sablonas Kruvos rikiavimo algoritmas angl heapsort rikiavimo algoritmas kai rikiuojama duomenis sukeliant į kruvos piramidine struktura Apibendrintas algoritmasAnimacija iliustruojanti kruvos rikiavimo algoritmaSudaroma Kruvos duomenu struktura Iteraciskai is sudarytos kruvos pasalinamos saknys Jas issaugome mum reikiama tvarka pvz realizuojant masyvu galime ja įrasyti į masyvo gale atsilaisvinusia vieta pasalinus saknį ji yra pakeiciama maziausiu kruvos lapu Gauta saknu seka yra surikiuota Kruvos sudarymasTarkim turime duomenu masyva a1 a2 an displaystyle a 1 a 2 a n Pirmiausia sukeiskime jo elementus vietomis kad gautume a1 a2 an displaystyle a 1 a 2 a n kur ai gt a2i displaystyle a i gt a 2i ir ai gt a2i 1 displaystyle a i gt a 2i 1 Grafiskai tai atrodys kaip dvejetainis medis kurio kiekvienos virsunes sunus yra ne didesni uz tevus Pradiniai duomenys Tarkime turime pradinius duomenis 6 4 8 7 3 9 1 2 displaystyle 6 4 8 7 3 9 1 2 Masyvo elementu skaicius n 8 displaystyle n 8 Pradesime nuo pradinio elemento i n 2 4 displaystyle i n 2 4 Elementu perkelimas bus vykdomas taip i 4 displaystyle i 4 6 4 8 7 3 9 1 2 i 3 displaystyle i 3 6 4 8 7 3 9 1 2 lt gt 6 4 9 7 3 8 1 2 i 2 displaystyle i 2 6 4 9 7 3 8 1 2 lt gt 6 7 9 4 3 8 1 2 i 1 displaystyle i 1 6 7 9 4 3 8 1 2 lt gt 9 7 6 4 3 8 1 2 lt gt 9 7 8 4 3 6 1 2 Sutvarkyti duomenys Taigi gavome 9 7 8 4 3 6 1 2 displaystyle 9 7 8 4 3 6 1 2 Siame masyve jau tenkinama musu mineta salyga Tokia duomenu struktura vadinama Kruva Pirma algoritmo dalis butent ir buvo kruvos sudarymas Antroji algoritmo dalis yra pats rikiavimas Eilineje iteracijoje imama kruvos virsune ir sukeiciama vietomis su paskutiniu masyvo elementu Kadangi kruvos virsuneje visada bus didziausias elementas tai jį sukeite vietomis su paskutiniu masyvo elementu zinosime kad didziausias masyvo elementas yra jo paskutineje pozicijoje Taip sukeite elementus vietomis turime atkurti kruva Tai padaryti paprasta nes vieta pakeites buna tik vienas elementas jis atsiduria virsuneje Sį elementa jei jis nera didziausias reikia perstumti keletu lygiu zemiau kol vel gausime kruva Tai atlike pradedame naujaja iteracija tik sį karta jau nagrinesime vienetu trumpesnį masyva nes didziausias elementas kuris anksciau buvo virsuneje jau atsidure savo vietoje ir jo nagrineti nereikia Tokiu iteraciju skaicius yra N 2 displaystyle N 2 Kruvos aukstis gali buti rastas formule log2 n 1 displaystyle lceil log 2 n 1 rceil Algoritmo savybesSis rikiavimo algoritmas nera stabilus Pirmoje algoritmo dalyje nereikes atlikti daugiau nei 2n 4 displaystyle 2n 4 palyginimu taigi pirmosios dalies sudetingumas tiesinis Antrojoje dalyje pirmasis medzio elementas sukeiciamas su paskutiniu vietomis ir atkuriama kruva Atkuriant kruva elementa blogiausiu atveju gali tekti perkelti is virsunes į apatinį lygį o kaip mineta medzio lygiu skaicius randamas log2 n 1 displaystyle lceil log 2 n 1 rceil arba log2 n 1 displaystyle log 2 n 1 jei tartume kad virsune yra 0 displaystyle 0 lygyje Taigi antroji lemiama algoritmo dalis yra O nlog n displaystyle O n log n sudetingumo Butent tokio sudetingumo ir yra algoritmas Joks rikiavimo algoritmas naudojantis palyginimus negali tureti mazesnio sudetingumo taciau bendru atveju uz jį greitesnis yra greitasis rikiavimo algoritmas Priesingai nei rikiavimo suliejimu kurio sudetingumas taip pat toks pats siam metodui nereikia papildomos atminties Rikiavimo medis gali buti naudojamas kaip prioritetu eile PavyzdziaiAlgoritmo Java kalbapublic class Pavyzdys private int duomenys private final int ilgis private void perstatyti int i int j if i lt j 2 int k1 2 i int k2 2 i 1 if k2 gt j k2 k1 int k if duomenys k1 1 gt duomenys k2 1 k k1 else k k2 if duomenys i 1 lt duomenys k 1 int laikinas duomenys i 1 duomenys i 1 duomenys k 1 duomenys k 1 laikinas perstatyti k j private void sudarytiRusiavimoMedi for int i ilgis 2 i gt 1 i perstatyti i ilgis private void rusiuotiKruvosMetodu sudarytiRusiavimoMedi for int i ilgis i gt 2 i int laikinas duomenys 0 duomenys 0 duomenys i 1 duomenys i 1 laikinas perstatyti 1 i 1 Nuorodoshttp www2 hawaii edu copley 665 HSApplet html Archyvuota kopija 2009 01 19 is Wayback Machine projekto spauskite mygtuka is desines http www sig lt linas teaching ad2005 dw lib exe fetch php cache cache amp media lectures 3A5 1p pdf neveikianti nuoroda Heapsort code

Naujausi straipsniai
  • Liepa 26, 2025

    Gyvavedės vėgėlės

  • Liepa 27, 2025

    Gyvagimdė vėgėlė

  • Liepa 26, 2025

    Gvidonas Labeckas

  • Liepa 27, 2025

    Gvanachuatas

  • Liepa 26, 2025

    Gumarne Puchov

www.NiNa.Az - Studija

    Susisiekite
    Kalbos
    Susisiekite su mumis
    DMCA Sitemap
    © 2019 nina.az - Visos teisės saugomos.
    Autorių teisės: Dadash Mammadov
    Nemokama svetainė, kurioje galima dalytis duomenimis ir failais iš viso pasaulio.
    Viršuje