sortowanie babelkowe

sortowanie babelkowe
lamaczyk
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 9 lat
  • Postów:29
0

Witam ponownie, mam problem z sortowaniem babelkowym. Oto kod:

Kopiuj
 #include <iostream>
#include <windows.h>
#include <ctime>

using namespace std;
int ile, i, j, zm;
void sortowanie_b(int* tab, int ile)
{

    do
    {
        int zm = 0;
        for (int i = 0; i <= ile - 1; i++)
        {
            if (tab[i] < tab[i + 1])
            {
                zm = zm + 1;
                int bufor;
                bufor = tab[i];
                tab[i] = tab[i + 1];
                tab[i + 1] = bufor;
            }
        }
    } while (zm != 0);
}

int main()
{
    srand(time(NULL));
    cout << "ile liczb wylosowac?  ";
    cin >> ile;
    cout << endl;
    int* tab;
    tab = new int[ile];

    for (i = 0; i <= ile - 1; i++)
    {
        tab[i] = rand() % 500 + 1;
        cout << tab[i] << endl << endl;
    }

    sortowanie_b(tab, ile);
    for (i = 0; i <= ile - 1; i++)
    {
        cout << tab[i] << endl;
    }

    delete[] tab;
    return 0;
}

Raz sortuje, raz nie chce, raz aplikacja ma błąd. Rozpisałem kod na kartce i powinien chodzic bez problemu. Nie mam pojecie OCB.

edytowany 1x, ostatnio: lamaczyk
twonek
popraw wcięcia: http://format.krzaq.cc/ styl file bo tego czytać się nie da
katelx
  • Rejestracja:około 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Hong Kong
3
Kopiuj
        for(int i=0;i<=ile;i++)
           {
            if(tab[i]<tab[i+1])

tab ma rozmiar 'ile' czyli elementy sa numerowane od 0 do ile-1, zdaje sie ze o tym zapomniales

edytowany 2x, ostatnio: katelx
twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
2

Zanim zmienisz to na

Kopiuj
for (int i = 0; i < ile; ++i)

i wrócisz z pytaniem "czemu nadal nie działa", popatrz na

Kopiuj
tab[i+1]

Dla i == ile-1 to nadal się wywali.

lamaczyk
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 9 lat
  • Postów:29
0

Poprawilem pętle for. Dodałem w niej poprawne założenia, tak by sie nie krzaczyło. A ten nadal nie chce sortowac jak należy.

Kopiuj
#include <iostream>
#include<windows.h>
#include<ctime>

using namespace std;
int ile,i,j,zm;
void sortowanie_b (int *tab,int ile)
    {

       do
    {
        int zm=0;
        for(int i=ile-1;i>=1;i--)
           {
            if(tab[i]>tab[i-1])
                {
                zm=zm+1;
                int bufor;
                bufor=tab[i-1];
                tab[i-1]=tab[i];
                tab [i]=bufor;
                }
            }
        }while(zm!=0);
    }

int main()
{
    srand(time(NULL));
    cout<<"ile liczb wylosowac?  ";
    cin>>ile;
    cout<<endl;
    int *tab;
    tab=new int[ile];

    for(i=0;i<=ile-1;i++)
    {
        tab[i]=rand()%500+1;
        cout<<tab[i]<<endl<<endl;
    }

    sortowanie_b(tab,ile);
    for(i=0;i<=ile-1;i++)
    {
    cout<<tab[i]<<endl;
    }

    delete [] tab;
    return 0;
}
 
xfin
  • Rejestracja:ponad 11 lat
  • Ostatnio:9 miesięcy
  • Lokalizacja:Genewa
  • Postów:597
1

Coś ty narobił z tą pętlą? Tam wystarczyło jedną rzecz zmienić :)

Kopiuj
#include <iostream>
#include<ctime>
 
using namespace std;
int ile,i,j,zm;
void sortowanie_b (int *tab,int ile)
    {
 
    do
    {
        int zm=0;
        for(int i=0;i<ile-1;i++)
           {
            if(tab[i]>tab[i+1])
                {
                zm=zm+1;
                int bufor;
                bufor=tab[i+1];
                tab[i+1]=tab[i];
                tab [i]=bufor;
                }
            }
        }while(zm!=0);
    }
 
int main()
{
    srand(time(NULL));
    cout<<"ile liczb wylosowac?  ";
    cin>>ile;
    cout<<endl;
    int *tab;
    tab=new int[ile];
 
    for(i=0;i<=ile-1;i++)
    {
        tab[i]=rand()%500+1;
        cout<<tab[i]<<endl;
    }
 
    sortowanie_b(tab,ile);
    cout<<"*********\n";
    for(i=0;i<=ile-1;i++)
    {
    cout<<tab[i]<<endl;
    }
 
    delete [] tab;
    return 0;
}

Na ideone sprawdziłem i ładnie już sortuje.

lamaczyk
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 9 lat
  • Postów:29
0

@xfin Miałeś szczęście:) Zobacz tu: https://ideone.com/CIExO5 . To po pierwsze. A po drugie kochany mi bez biblioteki cstdlib nie chce ruszyc funkcja srand. Juz sam nie wiem o co w tym chodzi.

twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
2

Dlaczego znowu zepsułeś wcięcia? (O_O)

Masz tutaj idealny przykład, dlaczego nie należy używać zmiennych globalnych. Podpowiedź

Kopiuj
do
{
    int zm=0;
    ...
}while(zm!=0);

zm które jest testowane w warunku while to nie jest to zm, które tworzysz wewnątrz pętli. Gdybyś nie miał zmiennej globalnej o tej samej nazwie to kompilator by od razu krzyczał, że nie wie co to jest zm, bo zmienna tworzona wewnątrz pętli nie ma zasięgu poza nią, więc w momencie testowania while ona już nie istnieje.

lamaczyk
za te wcięcia przepraszam. to bedzie ostatni raz:)
lamaczyk
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 9 lat
  • Postów:29
0

Czyli rzeczywiscie zmienne globalne to zło bez odpowiedniej swiadomosci;) Usunąłem inta wewnątrz pętli i działa jak należy. Chodz czuję, że powinienem to inaczej zrobić;) Dziękuje wszystkim za pomoc.

twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
3

Wywal te wszystkie zmienne globalne i popraw program tak, by się kompilował. Na ból zęba się nie amputuje głowy.

lamaczyk
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 9 lat
  • Postów:29
1

Masz racje @twonek. Już poprawilem. Tak to teraz wygląda:

Kopiuj
 #include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

void sortowanie_b(int* tab, int ile)

{
    int zm;

    do
    {
        zm = 0;
        for (int i = 0; i < ile - 1; i++)
        {
            if (tab[i] > tab[i + 1])
            {
                zm = zm + 1;
                int bufor;
                bufor = tab[i + 1];
                tab[i + 1] = tab[i];
                tab[i] = bufor;
            }
        }
    } while (zm != 0);
}

int main()
{
    int i, ile;
    srand(time(NULL));
    cout << "ile liczb wylosowac?  ";
    cin >> ile;
    cout << endl;
    int* tab;
    tab = new int[ile];

    for (i = 0; i <= ile - 1; i++)
    {
        tab[i] = rand() % 500 + 1;
        cout << tab[i] << endl;
    }

    sortowanie_b(tab, ile);
    cout << "*********\n";
    for (i = 0; i <= ile - 1; i++)
    {
        cout << tab[i] << endl;
    }

    delete[] tab;
    return 0;
}
twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
1

Już zupełnie się czepiając to

Kopiuj
bufor = tab[i + 1];
tab[i + 1] = tab[i];
tab[i] = bufor;

istnieje funkcja biblioteczna swap (nagłówek algorithm przed C++11, utility od C++11), która do tego służy, korzystaj z niej.

Kopiuj
int bufor;
bufor = tab[i + 1];

Jak możesz to zawsze inicjalizuj zmienną przy tworzeniu, czyli

Kopiuj
int bufor = tab[i+1];
Kopiuj
for (i = 0; i <= ile - 1; i++)

W C++ częściej się korzysta z warunku <, więc lepiej tak pisać

Kopiuj
for (int i = 0; i < ile; ++i)

Zdefiniuj lokalną zmienną do iterowania pętli, będzie mniej konfliktów. I używaj ++i zamiast i++.

Natomiast łapka ode mnie za chęć poprawy.

edytowany 3x, ostatnio: twonek
lamaczyk
Dziękuje, za uwagi. Będę się do nich stosował, bo dobre one są;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.