Gnex Napisano Październik 18, 2015 Zgłoś Napisano Październik 18, 2015 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; } } Cytuj
Bartosz Wójcik Napisano Październik 18, 2015 Zgłoś Napisano Październik 18, 2015 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); } Cytuj
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.