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

problem z quick sort

Object Storage Arubacloud
0 głosów
453 wizyt
pytanie zadane 6 kwietnia 2016 w C i C++ przez k171 Nowicjusz (120 p.)
edycja 9 kwietnia 2016 przez Arkadiusz Waluk

Witam, w celu pocwiczenia programowania postanowilem samemu napisac w/w algorytm, tak dla lepszego zrozumienia tematu. Program dziala jednak nie dla wszystkich konfiguracji liczb, dla liczb: 9,5,7,0,5,7,7,9 program sie juz sypie. Klika dni probuje juz wymyslic co moze byc nie tak i niestety bez skutku. Z gory dziekuje za pomoc. Ponizej kod programu:

#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

void sortowanie(int liczby[], int p, int q)  //posylamy funkcji: tablice, indeks pierwszej liczby, indeks ostatniej liczby
{
    int os,m,w=q,y=p;
    os=liczby[(p+q)/2];
    while(p<q)
    {
        while(liczby[p]<os) p++;
        while(liczby[q]>os) q--;
        if(p<q)
        {
            //zamiana miejscami
            m=liczby[p];
            liczby[p]=liczby[q];
            liczby[q]=m;
            p++;
            q--;
        }
    }
    if(w>y)
    {
        sortowanie (liczby,p,(y+w)/2);
        sortowanie (liczby,(y+w)/2 +1,w);
    }

}

 

int main()
{
    //--WPROWADZENIE I SPRAWDZENIE DANYCH--
    int n;
    cout << "Wprowadz ile liczb chcesz posortowac: ";
    cin>>n;
    //n - ilosc liczb
    while (n<=0)
    {
        cout<<"Liczba musi byc dodatnia!"<<endl;
        cout << "Wprowadz ile liczb chcesz posortowac: ";
        cin>>n;
    }
    int liczby[n];
    //tablica w ktorej beda przechowywane wprowadzone liczby
    //ponizej wprowadzanie liczb
    cout<<"Wprowadz pierwsza liczbe: ";
    cin>>liczby[0];
    for(int i=1; i<n; i++)
    {
        cout<<"Wprowadz kolejna liczbe: ";
        cin>>liczby[i];
    }

 

    //--SORTOWANIE (rosnaco) I MIERZENIE CZASU SORTOWANIA--
    clock_t start,stop;
    int czas;
    czas=(double)(stop-start)/CLOCKS_PER_SEC;

    sortowanie(liczby,0,n-1);

    //--WYPROWADZENIE DANYCH--
    for(int j=0; j<n; j++)
    {
        cout<<liczby[j]<<" ";
    }
    cout<<endl<<"Czas sortowania: "<<czas;

    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 8 kwietnia 2016 przez Woj Tek Nowicjusz (180 p.)
1. tablica jest kopiowana przez kolejne wykonywane funkcje -> tablica powinna byc przesylana przez referencje czy wskaznik albo druga opcja utworzyc klase i zmianiac wartosc danego obiektu

2. tablica nie moze byc statyczna, w Twoim przypadku n powinno byc static, jezeli chcesz miec zmienna wielkosc tablicy poczytaj o dynamicznych tablica, a jakbys poznal std::vector to by pewnie bylo Ci latwiej
komentarz 9 kwietnia 2016 przez niezalogowany
1. Tablica zawsze jest przekazywana jako orginał 2. Gdyby n było static i tak dalej nie było by to poprawne, niech najlepiej użyje vector'ów
0 głosów
odpowiedź 11 kwietnia 2016 przez bumpMind Gaduła (4,260 p.)

Błędny jest ostatni if w funkcji sortowanie a dokładniej zawarty w nim warunek, spróbuj użyć tego:

if( y<q ) {
        sortowanie (liczby,y,q); 
    }
    
if( w>p ) {
    	sortowanie (liczby,p,w);
     }

i rozkminić dlaczego tak powinno być :P Swoją drogą czasami łatwiej jest zobaczyć błąd w kodzie kiedy używasz bardziej opisowych zmiennych typu "poczIndex" lub "koncIndex" zamiast "p" czy "q", może nie jest to dość wygodne wpisywanie takiej zmiennej ale znacznie ułatwia to czytanie i zrozumienie danego kodu ;)

Podobne pytania

0 głosów
1 odpowiedź 136 wizyt
0 głosów
1 odpowiedź 520 wizyt
pytanie zadane 3 czerwca 2017 w C i C++ przez Wujek Początkujący (410 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

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

...