kupacrendezés

Üdvözlöm, Ön a kupacrendezés szó jelentését keresi. A DICTIOUS-ban nem csak a kupacrendezés szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a kupacrendezés szót egyes és többes számban mondani. Minden, amit a kupacrendezés szóról tudni kell, itt található. A kupacrendezés szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. Akupacrendezés és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Kiejtés

  • IPA:

Főnév

kupacrendezés

  1. (matematika, algoritmusok) A kupacrendezés (Heapsort) egy hatékony helyben működő rendezési algoritmus, amely a kiválasztásos rendezés optimalizált változata. Az algoritmus a bináris kupac (heap) adatszerkezetet használja az elemek rendezéséhez.



Elmélet

  1. Kupac definíció:
    • A kupac egy teljes bináris fa, amely eleget tesz a kupac tulajdonságnak:
      • Max-kupac: Minden csúcs értéke nagyobb vagy egyenlő a gyermekeinek értékénél.
      • Min-kupac: Minden csúcs értéke kisebb vagy egyenlő a gyermekeinek értékénél.
  2. Működés:
    • Az elemeket először max-kupaccá alakítjuk.
    • Az így kapott max-kupac gyökerében lesz a legnagyobb elem.
    • Kicseréljük a gyökér elemet a kupac utolsó elemével, majd a kupacot újjáépítjük a maradék elemekkel.
    • Ezt ismételjük, amíg az összes elem rendezetté nem válik.
  3. Időkomplexitás:
    • Építés: (O(n)).
    • Eltávolítás (kupac újjáépítése): (O(n)) elemenként.
    • Összesen: (O(n n)).
  4. Térkomplexitás:
    • (O(1)), mivel helyben működik (nem használ további memóriát).



Pszeudokód

Heapsort

HeapSort(A):
    n = A mérete
    BuildMaxHeap(A, n)
    ciklus i = n-1-től 1-ig:
        cseréljük meg A és A elemet
        MaxHeapify(A, 0, i)

BuildMaxHeap

BuildMaxHeap(A, n):
    ciklus i = n//2-1-től 0-ig:
        MaxHeapify(A, i, n)

MaxHeapify

MaxHeapify(A, i, n):
    left = 2*i + 1
    right = 2*i + 2
    largest = i

    ha left < n és A > A:
        largest = left
    ha right < n és A > A:
        largest = right
    ha largest != i:
        cseréljük meg A és A elemet
        MaxHeapify(A, largest, n)

Python implementáció

def heapify(arr, n, i):
    largest = i  # Gyökér
    left = 2 * i + 1  # Bal gyermek
    right = 2 * i + 2  # Jobb gyermek

    # Ha a bal gyermek nagyobb, mint a gyökér
    if left < n and arr > arr:
        largest = left

    # Ha a jobb gyermek nagyobb, mint a legnagyobb
    if right < n and arr > arr:
        largest = right

    # Ha a legnagyobb nem a gyökér
    if largest != i:
        arr, arr = arr, arr  # Cseréljük
        heapify(arr, n, largest)

def heapsort(arr):
    n = len(arr)

    # Max-kupac építése
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)

    # Elem eltávolítása a kupacból
    for i in range(n - 1, 0, -1):
        arr, arr = arr, arr  # Gyökér és utolsó elem cseréje
        heapify(arr, i, 0)

# Példa
data = 
heapsort(data)
print("Rendezett tömb:", data)

Kimenet:

Rendezett tömb: 

C++ implementáció

#include <iostream>
#include <vector>
using namespace std;

void heapify(vector<int>& arr, int n, int i) {
    int largest = i;         // Gyökér
    int left = 2 * i + 1;    // Bal gyermek
    int right = 2 * i + 2;   // Jobb gyermek

    // Ha a bal gyermek nagyobb, mint a gyökér
    if (left < n && arr > arr) {
        largest = left;
    }

    // Ha a jobb gyermek nagyobb, mint a legnagyobb
    if (right < n && arr > arr) {
        largest = right;
    }

    // Ha a legnagyobb nem a gyökér
    if (largest != i) {
        swap(arr, arr);
        heapify(arr, n, largest);  // Rekurzív hívás
    }
}

void heapsort(vector<int>& arr) {
    int n = arr.size();

    // Max-kupac építése
    for (int i = n / 2 - 1; i >= 0; i--) {
        heapify(arr, n, i);
    }

    // Elem eltávolítása a kupacból
    for (int i = n - 1; i > 0; i--) {
        swap(arr, arr);  // Gyökér és utolsó elem cseréje
        heapify(arr, i, 0);    // Kupac újraépítése
    }
}

int main() {
    vector<int> data = {12, 11, 13, 5, 6, 7};
    heapsort(data);

    cout << "Rendezett tömb: ";
    for (int num : data) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

Kimenet:

Rendezett tömb: 5 6 7 11 12 13

Összegzés

  • Előnyök:
    • Stabil (O(n n)) időkomplexitás.
    • Helyben működik, nincs szükség extra memóriára.
  • Hátrányok:
    • Nem stabil rendezés (az azonos elemek sorrendje megváltozhat).

A kupacrendezés hatékony és megbízható módszer nagy adathalmazok rendezésére, különösen akkor, ha a memóriagazdálkodás kiemelten fontos.


Fordítások