Skocz do zawartości

Sortowanie bąbelkowe


Gnex

Recommended Posts

Witam!
Napisałem program, który w domyśle miał sortować metodą bąbelkową. Jednak istnieje bardzo dziwny problem,którego nie mogę zlokalizować mianowicie dla dowolnych danych wejściowych np. 22, 21, 48 po posortowaniu wyrzuca wynik typu 3,21,22 albo 21,3,22 i nie mam bladego pojęcia czemu tak się dzieje.

#include <iostream>
#include <algorithm>
using namespace std;


void BubbleSort(int tab[]);
void Wyswietl(int tab[]);

int main()
{
    int iTab[3];
    cout << "Sortowanie babelkowe" << endl;
    cout << "Podaj 3 liczby: " << endl;
    for (int i = 0; i < 3; i++)
    {
        cin >> iTab[i];
    }
    cout << "Przed sortowaniem: " << endl;
    Wyswietl (iTab);
    cout << "Po sortowaniu: " << endl;
    BubbleSort(iTab);
    Wyswietl(iTab);
    return 0;
}

void BubbleSort(int tab[])
{
    int n = sizeof(tab);
    int temp = 0;
    do {
        for (int i = 0; i < n-1; i++)
        {
            if (tab[i] > tab[i+1])
            {
                swap(tab[i],tab[i+1]);
                //temp = tab[i];
                //tab[i] = tab[i+1];
                //tab[i+1] = temp;
            }
        }
        n = n - 1;
    }while(n>1);
}

void Wyswietl(int tab[])
{
    for (int i = 0; i < 3; i++)
    {
        cout << tab[i] << endl;
    }
}

 

Link do komentarza
Udostępnij na innych stronach

Piszesz to w C++, pierwszy błąd jaki widzę, to że int n = sizeof(tab) n będzie miało błędny rozmiar, sizeof() nie może wiedzieć ile jest elementów w tablicy (to nie jest klasa), musisz dodatkowo taki parametr przekazywać dla funkcji sortowania, dla dynamicznych tablic po prostu liczbę, a dla statycznych możesz wykorzystać makro _countof().

Drugi błąd to pętla while(n > 1). W sortowaniu bąbelkowym tak długo sortujesz dopóki żadna para nie zostanie wymieniona, ty tam dodatkowo uszkadasz zmienną N.

Od ręki napisane, ale spróbuj tak:

void BubbleSort(int tab[], int n)
{
    bool wymieniono;

    do {
    
        // przed petla jeszcze nic nie wymieniono
        wymieniono = false;
        
        for (int i = 0; i < n-1; i++)
        {
            if (tab[i] > tab[i+1])
            {
                swap(tab[i],tab[i+1]);
                
                // wymiana nastapila
                wymieniono = true;
            }
        }
    
    // powtarzaj wymiane dopoki cos zostalo zamienione
    // jesli nic juz nie bylo zamieniane - przerwij prace
    } while(wymieniono == true);
}

 

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...