sortowanie babelkowe

0

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

 #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.

3
        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

2

Zanim zmienisz to na

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

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

tab[i+1]

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

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.

#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;
}
 
1

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

#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.

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.

2

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

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

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.

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.

3

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

1

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

 #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;
}
1

Już zupełnie się czepiając to

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.

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

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

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

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

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1