Skocz do zawartości

Sortowanie bąbelkowe


Recommended Posts

Napisano

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

 

Napisano

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);
}

 

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