Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

[C++] Sortowanie bąbelkowe

Moderatorzy: Jacek Bogusz, Moderatorzy

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

[C++] Sortowanie bąbelkowe

Postautor: Darlington » 24 kwie 2009, o 23:31

Oto mój kod na sortowanie bąbelkowe, będę wdzięczny za wszelkie uwagi, spostrzeżenia i porady.

Kod: Zaznacz cały

// Sortowanie babelkowe #include <iostream> using namespace std; void babelki(int tablica[100], int n); int pobranie_danych(int &n, int tablica[100]); // n przesylamy do funkcji przez referencje, bo chcemy pracowac na oryginalnej zmiennej w funkcji a nie jej kopii, // tablica z definicji jest przesylana przez referencje int main() { int n,tablica[100]={0}; if(pobranie_danych(n, tablica)) // jezeli wlasciwe dane(n>0) babelki(tablica, n); // to wywolujemy wlasciwa funkcje return 0; } //***************************************************************************** void babelki(int tablica[100], int n) { int temp, counter=1, liczba_zamian=0, ilosc_przejsc=0; while(counter) // dopoki wystepuje co najmnniej jedna zamiana 2 elementow w tablicy { counter=0; // zerujemy licznik zamian w jednym przejsciu tablicy for(int j=0; j<n-1; j++) // wlasciwa petla, do n-1 bo statniego elementu nie musimy sprawdzac { if(tablica[j]>tablica[j+1]) // warunek zamiany { temp=tablica[j+1]; // tablica[j+1]=tablica[j]; // zamiana tablica[j]=temp; // counter++; // wewnetrzny licznik ilosci zamian w jednym przejsciu tablicy } } if(!ilosc_przejsc) cout << endl; // kosmetyczne cout << "Przejscie nr " << ilosc_przejsc+1 << ": ["; for(int k=0; k<n; k++) { cout << tablica[k]; // drukujemy czastkowe wyniki sortowania po kazdym kolejnym przejsciu if(k<n-1) cout << ", "; // kosmetyczne, usuwamy przecinek po ostatnim elemencie } cout << "]" << endl; liczba_zamian=liczba_zamian+counter; // laczna liczba zamian ilosc_przejsc++; // liczba przejsc tablicy } cout << endl << "Posortowana tablica: " << endl << " ["; for(int k=0; k<n; k++) { cout << tablica[k]; // drukowanie posortowanej tablicy if(k<n-1) cout << ", "; } cout << "]" << endl << endl << "Ilosc zamian liczb: " << liczba_zamian << endl; cout << "Ilosc przejsc przez tablice: " << ilosc_przejsc << endl; } //***************************************************************************** int pobranie_danych(int &n, int tablica[100]) { cout << "Podaj liczbe wyrazow n: "; cin >> n; if(n<=0) { cout << "Zla liczba wyrazow!" << endl; return 0; // zwracamy 0 czyli sortowanie sie nie odbedzie } for(int i=0; i<n; i++) // petla do podawania elementow { cout << "Podaj element nr " << i+1 << ": "; cin >> tablica[i]; } return 1; // zwracamy 1 i mozemy sortowac }

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 25 kwie 2009, o 21:27

Dokonałem paru poprawek:
1. Tablice przesyłane do funkcji w sposób tablica[], a więc poprzez wskaźnik do ich zerowego elementu;
2. Lepsza kontrola danych wejściowych (n>100);
3. Funkcja nie sortuje elementów już posortowanych, co przyspiesza algorytm i zmniejsza liczbę wywołań wewnętrznej funkcji;
4. Funkcja pobierania danych zwraca typ bool;

Kod: Zaznacz cały

// Sortowanie babelkowe #include <iostream> using namespace std; void babelki(int tablica[], int n); bool pobranie_danych(int &n, int tablica[]); // n przesylamy do funkcji przez referencje, bo chcemy pracowac na oryginalnej zmiennej w funkcji a nie jej kopii, // tablica z definicji jest przesylana przez referencje int main() { int n,tablica[100]={0}; if(pobranie_danych(n, tablica)) // jezeli wlasciwe dane(n>0) babelki(tablica, n); // to wywolujemy wlasciwa funkcje return 0; } //***************************************************************************** void babelki(int tablica[], int n) { int temp, counter=1, liczba_zamian=0, ilosc_juz_posortowanych=1, ilosc_przejsc=0, licz=0; while(counter) // dopoki wystepuje co najmnniej jedna zamiana 2 elementow w tablicy { counter=0; // zerujemy licznik zamian w jednym przejsciu tablicy for(int j=0; j<n-ilosc_juz_posortowanych; j++) // wlasciwa petla, do n-1 bo statniego elementu nie musimy sprawdzac { if(tablica[j]>tablica[j+1]) // warunek zamiany { temp=tablica[j+1]; // tablica[j+1]=tablica[j]; // zamiana tablica[j]=temp; // counter++; // wewnetrzny licznik ilosci zamian w jednym przejsciu tablicy } } ilosc_juz_posortowanych++; if(!ilosc_przejsc) cout << endl; // kosmetyczne cout << "Przejscie nr " << ilosc_przejsc+1 << ": ["; for(int k=0; k<n; k++) { cout << tablica[k]; // drukujemy czastkowe wyniki sortowania po kazdym kolejnym przejsciu if(k<n-1) cout << ", "; // kosmetyczne, usuwamy przecinek po ostatnim elemencie } cout << "]" << endl; liczba_zamian=liczba_zamian+counter; // laczna liczba zamian ilosc_przejsc++; // liczba przejsc tablicy } cout << endl << "Posortowana tablica: " << endl << " ["; for(int k=0; k<n; k++) { cout << tablica[k]; // drukowanie posortowanej tablicy if(k<n-1) cout << ", "; } cout << "]" << endl << endl << "Ilosc zamian liczb: " << liczba_zamian << endl; cout << "Ilosc przejsc przez tablice: " << ilosc_przejsc << endl; } //***************************************************************************** bool pobranie_danych(int &n, int tablica[]) { cout << "Podaj liczbe wyrazow n: "; cin >> n; if((n<=0) || (n>100)) { cout << "Zla liczba wyrazow!" << endl; return 0; // zwracamy 0 czyli sortowanie sie nie odbedzie } for(int i=0; i<n; i++) // petla do podawania elementow { cout << "Podaj element nr " << i+1 << ": "; cin >> tablica[i]; } return 1; // zwracamy 1 i mozemy sortowac }
Będę nadal wdzięczny za wszelkie uwagi, spostrzeżenia i porady.

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 26 gości