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

implementacja quicksort.

+1 głos
373 wizyt
pytanie zadane 27 czerwca 2020 w C i C++ przez Marcinuq Użytkownik (690 p.)
edycja 27 czerwca 2020 przez Marcinuq

Witam! 

Chciałbym dowiedzieć się jaki problem występuje w tym kodzie. W build log nie ma żadnych błędów.Chodzi o to, że po wypisaniu tablicy nie uporządkowanej konsola się zamyka.

#include <iostream>
#include <time.h>
#include <windows.h>
using namespace std;

void sortowanie(int *tab, int lewy, int prawy)
{
    int S = tab[(lewy+prawy)/2];
    int bufor;
    int l=lewy;
    int p=prawy;

    do
    {
        while(tab[l]<S)
            l++;
        while(tab[p]>S)
            p++;

        if(l<=p)
        {
            bufor=tab[l];
            tab[l]=tab[p];
            tab[p]=bufor;
            l++;
            p--;
        }
    }
    while(l<=p);

    if(p>lewy)
        sortowanie(tab,lewy, p);
    if(l<prawy)
        sortowanie(tab, l, prawy);
}


int main()
{
    srand(time(0));

    int ile;
    cout<<"ile liczb: ";
    cin>>ile;

    int* tab;
    tab= new int[ile];

    for(int i=0; i<=ile-1; i++)
    {
        tab[i]=rand()%100+1;
    }

    for(int i=0; i<=ile-1; i++)
    {
        cout<<tab[i]<<" ";
    }

    sortowanie(tab, 0, ile-1);

    for(int i=0; i<=ile-1; i++)
    {
        cout<<tab[i]<<" ";
    }

    delete [] tab;
    return 0;
}

 

1 odpowiedź

+2 głosów
odpowiedź 27 czerwca 2020 przez adrian17 Mentor (355,180 p.)
wybrane 27 czerwca 2020 przez Marcinuq
 
Najlepsza

Wychodzisz poza tablicę w tych okolicach:

        while(tab[l]<S)
            l++;
        while(tab[p]>S)
            p++;

Hint: albo otwórz program w debuggerze (jeśli używasz VS, to bardzo łatwo), a jak nie umiesz to dodaj mnóstwo `cout` piszących wartości indeksów tablice. W końcu trafisz na moment gdzie indeks jest poza <0 lub >= ile - wtedy możesz zbadać, jak do tego doszło.

komentarz 27 czerwca 2020 przez VBService Ekspert (256,580 p.)

Potwierdzam w tym miejscu wychodzi poza zakres

        while(tab[l]<S)
            l++;
        while(tab[p]>S)
            p++;

Quicksort C - Segmentation fault

1
komentarz 27 czerwca 2020 przez adrian17 Mentor (355,180 p.)

Potwierdzam w tym miejscu wychodzi poza zakres

(akurat tutaj nie zgadywałem, zawsze taki kod odpalam z AddressSanitizerem i daje mi konkretną linię ;))

1
komentarz 27 czerwca 2020 przez Marcinuq Użytkownik (690 p.)

Wiem już, nie dojrzałem się po prostu zamiast p-- zrobiłem p++. Pomyłki się zdarzają faktycznie wychodziłem poza tablicę. Dziękuje za pomocsmiley.

Podobne pytania

0 głosów
1 odpowiedź 865 wizyt
pytanie zadane 23 kwietnia 2020 w C i C++ przez Rrafał98 Nowicjusz (240 p.)
0 głosów
1 odpowiedź 783 wizyt
pytanie zadane 28 marca 2020 w C i C++ przez wall7489 Obywatel (1,280 p.)
0 głosów
3 odpowiedzi 663 wizyt
pytanie zadane 2 czerwca 2015 w C i C++ przez criss Mędrzec (172,570 p.)

93,742 zapytań

142,678 odpowiedzi

323,297 komentarzy

63,326 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...