• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sortowanie struktur za pomocą kopcowania

Object Storage Arubacloud
0 głosów
274 wizyt
pytanie zadane 21 czerwca 2018 w C i C++ przez siemasiema123.96 Początkujący (350 p.)

Czy mógłby mnie ktoś nakierować jak za pomocą kopcowania mogę posortować strukturę po wieku? (od najmłodszej do najstarszej osoby), Z sortowaniem bąbelkowym nie miałem problemu, ale za kopcowanie nie wiem w ogóle jak się zabrać. A tu kod bąbelkowego

    int i,j;
    int tmp;
    for(j = 0; j < licznik_struktur - 1; j++)
    {
        for(i = 0; i < licznik_struktur - 1; i++)
        {
            if(X[i].rok > X[i+1].rok)
            {
                tmp = X[i+1].rok;
                X[i + 1].rok = X[i].rok;
                X[i].rok = tmp;
            }
        }
    }

 

komentarz 21 czerwca 2018 przez RafalS VIP (122,820 p.)
Z czym masz problem? Jak z koncepcją samego sortowania przez kopcowanie to wygogluj.
komentarz 21 czerwca 2018 przez siemasiema123.96 Początkujący (350 p.)
Kod kopcowania mam przygotowany, ale dla sortowania tablicy, a nie wiem jak to zrobić na przykładzie struktury.
komentarz 21 czerwca 2018 przez RafalS VIP (122,820 p.)
Zrob tablice struktur. A podownuj je tak jak w babelkowym.
komentarz 21 czerwca 2018 przez siemasiema123.96 Początkujący (350 p.)

Dobra, ogarnąłem ;)

void heapify(struct daneks X[], int i, int n)
{
    int largest;
    int l = left(i);
    int r = right(i);
    if (l<n && X[l].rok > X[i].rok)
        largest = l;
    else
        largest = i;

    if (r < n && X[r].rok > X[largest].rok)
        largest = r;
    if (largest != i)
    {
        int x;
        x=X[i].rok;
        X[i].rok=X[largest].rok;
        X[largest].rok=x;
        heapify(X, largest, n);
    }
}

void build_heap(struct daneks X[],int licznik_struktur)
{
    int i;
    for (i=licznik_struktur/2; i>=0; --i) ///???
        heapify(X,i,licznik_struktur);
}

void heapsort(struct daneks X[], int licznik_struktur)
{
    build_heap(X,licznik_struktur);
    int i;
    int n = licznik_struktur;
    for (i=licznik_struktur-1; i>=1; --i)
    {
        int x=X[0].rok;
        X[0].rok=X[i].rok;
        X[i].rok=x;

        --n;
        heapify(X,0,n);
    }
}

A powiesz mi jeszcze jak zrobić w drugą stronę? Czyli od największego wieku do najmniejszego?

komentarz 21 czerwca 2018 przez RafalS VIP (122,820 p.)
:D zamien znaki > na < tak gdzie porównujesz lata :D
komentarz 21 czerwca 2018 przez siemasiema123.96 Początkujący (350 p.)

Zamieniłem tak i nie sortuje teraz dobrze :p

void heapify_nierosnaco(struct daneks X[], int i, int n)
{
    int largest;
    int l = left(i);
    int r = right(i);
    if (l < n && X[l].rok < X[i].rok)
        largest = l;
    else
        largest = i;

    if (r < n && X[r].rok < X[largest].rok)
        largest = r;
    if (largest != i)
    {
        int x;
        x=X[i].rok;
        X[i].rok=X[largest].rok;
        X[largest].rok=x;
        heapify(X, largest, n);
    }
}

 

komentarz 21 czerwca 2018 przez k222 Nałogowiec (30,150 p.)
Tak dodając swoje trzy grosze, czy twoja struktura zawiera tylko rok?

Bo jak tak to bez sensu, a jak nie to przy swoich szorowaniach zamieniasz miejscami tylko zmienne rok, nie zważając na całą resztę, przez co całkiem zmieniają ci się dane.
komentarz 21 czerwca 2018 przez siemasiema123.96 Początkujący (350 p.)

Mam jeszcze imię i nazwisko w dwóch osobnych polach. 

struct daneks {
    char imie[MAX_IMIE];
    char nazwisko[MAX_NAZW];
    int rok;
};

 

komentarz 21 czerwca 2018 przez k222 Nałogowiec (30,150 p.)
Więc przed sortowaniem masz

Jan Kowalski 1999
Maria Nowak 2004

a po sortowaniu

Jan Kowalski 2004
Maria Nowak 1999

 

więc to trzeba zmienić, bo na wyjściu masz inne dane

najlepiej chyba zrobić osobną funkcję tupu swap(x,y) która to będzie zamieniać, żeby funkcji nie rozciągać niepotrzebnie
komentarz 22 czerwca 2018 przez siemasiema123.96 Początkujący (350 p.)
        daneks tmp = X[0].imie;
        X[0].imie= X[i].imie;
        X[i].imie = tmp;

czemu tmp nie mogę tak zrobić ani za pomocą tablicy char? :p

komentarz 22 czerwca 2018 przez k222 Nałogowiec (30,150 p.)
masz tam tablice charów, czyli łańcuchy znakowe, do ich kopiowania jest specjalna funkcja strcpy(,) (albo kopiowanie komórka po komórce)

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 274 wizyt
pytanie zadane 15 maja 2016 w C i C++ przez krzych719 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 1,582 wizyt
pytanie zadane 9 czerwca 2018 w C i C++ przez WhizzKid Początkujący (400 p.)
0 głosów
2 odpowiedzi 905 wizyt
pytanie zadane 7 kwietnia 2016 w C i C++ przez Jędrzej Dembowski Użytkownik (740 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...