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

[C++] Sortowanie szybkie

Object Storage Arubacloud
+5 głosów
2,176 wizyt
pytanie zadane 9 kwietnia 2015 w Algorytmy przez 1110200039910 Gaduła (4,630 p.)

Witam, proszę Was o uzupełnienie algorytmu sortowania szybkiego o komentarze. Chodzi o to że nie do końca rozumiem działanie samej funkcji.

Wiem że algorytm dzieli tablice na dwie partycje, nastepnie zaczyna dzielić te partycje na kolejne metodą "Dziel i zwyciężaj" jednak nie rozumiem np. tej części kodu, wiem że zapętla on działanie funkcji (rekurencja) partycjując coraz mniejsze zbiory, ale dlaczego np. dane wprowadzane do funkcji 'Sortowanie' są różne od siebie

if (q>lewy) Sortowanie(tablica,lewy,q);         
if (p<prawy) Sortowanie(tablica,p,prawy);

tzn. występuje (tablica,lewy,q), a dlaczego niżej nie ma (tablica,prawy,p) tylko (tablica,p,prawy).

Proszę o pomoc, najlepiej by było gdyby ktoś uzupełnił algorytm o odpowiednie komentarze. Oto kod:

void Sortowanie(int *tablica, int lewy, int prawy)
{
    int v=tablica[(lewy+prawy)/2]; 
    p=lewy;
    q=prawy;
    do
    {
        while (tablica[p]<v) p++;                  
        while (tablica[q]>v) q--;
        if (p<=q)
        {
            swap (tablica[p],tablica[q]);
            p++;
            q--;
        }
    }   while (p<=q);
    if (q>lewy) Sortowanie(tablica,lewy,q);         
    if (p<prawy) Sortowanie(tablica,p,prawy);
}

 

2 odpowiedzi

+2 głosów
odpowiedź 9 kwietnia 2015 przez bossik21 Mądrala (5,750 p.)
edycja 9 kwietnia 2015 przez bossik21
 
Najlepsza
void Sortowanie(int *tablica, int lewy, int prawy)
{
    int v=tablica[(lewy+prawy)/2]; 
    p=lewy;
    q=prawy;
    do
    {
        while (tablica[p]<v) p++; //Wyszukujemy od Lewej strony tablicy element wiekszy od piwota               
        while (tablica[q]>v) q--; // Wyszukujemy od prawej strony tablicy element mniejszy od piwota
        if (p<=q)
        {
            swap (tablica[p],tablica[q]);
            //Zamieniamy elementy tak aby wiekszy od piwota podszedl na prawa strone
            // a mniejszy od piwota poszedl na lewa
            p++; 
            q--;
        }
    }   while (p<=q);
    if (q>lewy) Sortowanie(tablica,lewy,q);         
    if (p<prawy) Sortowanie(tablica,p,prawy);
}

 


Dlaczego jest  to :


if (q>lewy) Sortowanie(tablica,lewy,q);        

if (p<prawy) Sortowanie(tablica,p,prawy);



 

Dlatego, że gdy posortujesz już tablicę względem piwota, że po lewo od piwota będziesz miał elementy mniejse, a po prawej elementy większe, to następnie musisz posortować te nowe "mniejsze części tablicy" i dlatego wykonujesz potem sortowanie oddzielnie lewej części tablicy i prawej części tablicy.

 

PS. Możesz mi powiedzieć jak wstawiać kod tak ładnie poformatowany?

komentarz 9 kwietnia 2015 przez 1110200039910 Gaduła (4,630 p.)
Jak piszesz post to u góry masz te znaczki, klikasz znaczek z widocznym symbolem [...]CODE i tam wybierasz jezyk oraz wpisujesz tresc
komentarz 9 kwietnia 2015 przez bossik21 Mądrala (5,750 p.)
Dzięki, zaraz porawię post :)
+2 głosów
odpowiedź 9 kwietnia 2015 przez mgpl Obywatel (1,430 p.)

Witam.

Tutaj jest wszystko pięknie opisane: http://edu.i-lo.tarnow.pl/inf/alg/003_sort/0018.php

komentarz 9 kwietnia 2015 przez 1110200039910 Gaduła (4,630 p.)
Jak wspominałem, sam algorytm jest dla mnie zrozumiały, przeczytałem cały artykuł który podesłałeś przed zadaniem pytania.Mimo wszystko funkcja napisana wyżej w C++ to dla mnie magia.

Podobne pytania

0 głosów
1 odpowiedź 278 wizyt
pytanie zadane 29 maja 2015 w Algorytmy przez Kororo3 Nowicjusz (150 p.)
0 głosów
1 odpowiedź 329 wizyt
pytanie zadane 28 marca 2020 w C i C++ przez wall7489 Obywatel (1,250 p.)
0 głosów
2 odpowiedzi 609 wizyt

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 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!

...