• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie z sortowaniem bąbelkowym

Object Storage Arubacloud
0 głosów
126 wizyt
pytanie zadane 8 marca w C i C++ przez viktor23 Nowicjusz (130 p.)

Przedszkolaki wyruszyły na spacer do parku. Grupa n osób ustawiła się przy wężu dość przypadkowo. Tymczasem Przedszkolanka - Pani Sylwia, preferuje aby osoby najniższe szły z przodu, a najwyższe z tyłu.

Porównuje więc stojących przedszkolaków parami (ostatni z przedostatnim, przedostatni z trzecim od końca, trzeci od końca z czwartym od końca itd) i jeśli to konieczne zamienia ich miejscami. Postępując w ten sposób przeszła od końca do początku grupy i spostrzegła, że grupa jeszcze nie jest jeszcze posortowana, więc postanowiła wykonać tę czynność jeszcze raz.

Napisz program, który wypisze ile minimalnie przejść musi wykonać Pani Sylwia, aby grupa została ustawiona w wymaganym porządku.

 

Wejście:

Pierwszy wiersz zawiera dwie liczby naturalne  n, k  (1 ≤ n, k ≤ 30 ) n - liczba przedszkolaków 

Drugi wiersz zawiera  n liczb naturalnych  ai  (0 ≤ ai ≤ 200 ) - wzrost kolejnych przedszkolaków.

Wyjście 

Pierwszy i jedyny wiersz wyjścia zawiera liczbę naturalną określającą ilość przejść Pani Przedszkolanki

Przykład:

Dla danych wejściowych:

10 
77 83 85 81 89 80 72 91 76 84

poprawną odpowiedzią jest:

5

Coś takiego mam, ale nie działa jak trzeba.

#include <iostream> #include <algorithm>

using namespace std;

int main() {int n,k=0;

cin>>n;

int T[30], t[30], t2[30];

for(int i=0;i<n;i++) { cin>>T[i]; }

for(int i=0;i<n;i++) { t[i]=T[i]; }

for(int i=0;i<n-1;i++) { for(int i=n-1;i>=0;i--) { if(T[i]<T[i-1]) { int pom=T[i]; T[i]=T[i-1]; T[i-1]=pom; } } }

for(int i=0;i<n;i++) { t2[i]=T[i]; }

while(!std::equal(t2, t2 + n, t))

{ for(int i=0;i<n-1;i++) { for(int i=n-1;i>=0;i--) { if(T[i]<T[i-1]) { int pom=T[i]; T[i]=T[i-1]; T[i-1]=pom; } } } k++; }

cout<<k;

return 0; }

Proszę o pomoc!enlightened

 

komentarz 9 marca przez Oscar Nałogowiec (29,320 p.)
edycja 9 marca przez Oscar
Nie wiem czy wyniku nie da się otrzymać szybciej, bez sortowania, ale jeśli już zdecydowałeś się na wykonanie tego sortowania i w międzyczasie policzenie tych przejść to je licz.

Trochę dziwnie teraz uczą. Mnie uczyli, że sortowanie bąbelkowe robi się w postaci dwóch pętli - zewnątrzna jest repeat-until (to było w Pascalu, w C będzie do-while), a wewnętrzna for. Ta zewnętrzna powtarza się aż w tej wewnętrznej nie dokona się żadna zamiana. Potrzebna jest więc flaga lub licznik, która jest zerowany na początku pętli zewnętrznej i ustawiana w trakcie każdej zamiany elementów w pętli wewnętrznej (jak licznik to inkrementowany). Całość kończy się jak wewnętrzna pętla zrobi "pusty przebieg" - tylko sprawdzający czy jest ok. Być może to będzie jedyny przebieg - gdyby tablica już była posortowana. W takiej implementacji od razu masz wynik - wystarczy tylko liczyć przebiegi zewnętrznej pętli.

W sumie w twoim kodzie widzę dwa razy pełne sortowanie w tym jedno w pętli - w jakim celu?

Wewnętrzne pętle są do 0 włącznie (i>=0) a wewnątrz odwołujesz się do elementu i-1 - a więc wychodzisz poza tablicę.

Trochę dziwne jest stosowanie tak samo nazwanej zmiennej w zagnieżdzonych pętlach - akurat tutaj chyba nie przeszkadza, bo ta zewnętrzna jest nie używana, ale dziwnie wygląda.
komentarz 9 marca przez viktor23 Nowicjusz (130 p.)
Zrobiłem to tak, bo kompletnie nie wiedziałem jak mam sprawdzić to kiedy są już posortowane i dalej nie wiem, bo nie znam się na tym aż tak bardzo i potrzebuję łopatologicznego wytłumaczenia na podstawie kodu, ale dziękuję za komentarz.
komentarz 9 marca przez Oscar Nałogowiec (29,320 p.)
edycja 9 marca przez Oscar

Staram się nie podawać gotowców, więc podam taki szkic kodu bez tych fragmentów które mialeś dobrze:

int przebieg = 0;
bool zamiana;

do
{
    zamiana = false;
    for (int i = n-1; i>0; i--)
    {
        if (T[i]<T[i-1])
        {
             [ zamiana elementow tablicy - bylo ok ]
             zamiana = true;
        }
    }
    przebieg++;
}
while (zamiana);   

cout << przebieg << endl;

W sumie raz wykonujesz takie sortowanie i masz wynik.

Oczywiście trzeba rozważyć jak się odnosi rzeczywistość do programu komputerowego. Nauczycielka nie musi robić pustego przebiegu - w treści jest "spostrzegła" - wieć jakby od razu widzi czy już jest dobrze - być może trzeba nie liczyć tego finałowego przebiegu programu i po prostu wyświetlić o jeden mniej.

Z drugiej strony w programie można wrócić na konieć jednym podstawieniem, a nauczycielka musi jednak tam pójść, nie teleportuje się. A wracająć może też wykonywać zamiany - czyli byłyby dwie pętle wewnętrzne - jedna w dół, jedna w górę. Akurat dla sortowania bąbelkowego kierunek tej pętli może znacząco wpłynąć na  czas wykonania (zależnie od danych).

komentarz 10 marca przez viktor23 Nowicjusz (130 p.)
edycja 10 marca przez viktor23

Dziękuję za pomocsmiley. Dla danych jednak daje wynik 6.

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{int n,k=0;
cin>>n;
int T[30];
for(int i=0;i<n;i++)
{
	cin>>T[i];
}
int przebieg = 0;
bool zamiana;
 
do
{
    zamiana = false;
    for (int i = n-1; i>0; i--)
    {
        if (T[i]<T[i-1])
        {
             int pom=T[i];
			T[i]=T[i-1]; T[i-1]=pom;
             zamiana = true;
        }
    }
    przebieg++;
}
while (zamiana);   
 
cout << przebieg << endl;

	return 0;
}

 

komentarz 10 marca przez Oscar Nałogowiec (29,320 p.)
Tak jak pisałem - program musi zrobić jeden pusty przebieg, człowiek spojrzy i już wie. Trzeba wypisać przebieg-1.
komentarz 13 marca przez viktor23 Nowicjusz (130 p.)

Tak zrobiłem i jest prawie wszystko dobrze gdyby nie to, że dla

5
70 70 70 70 70

powinno być 1 a przez to -1 daje na końcu 0. Może dać jakieś sprawdzenie czy wszystkie liczby w ciągu są równe i wtedy 1 wypisać a w innym wypadku tatmto co już było.

komentarz 14 marca przez Oscar Nałogowiec (29,320 p.)
To nie jest przypadek wszystkich liczb równych, tylko ciągu już posortowanego. Zadanie jest trochę niejednoznaczne, zależy od tego odwzorowania rzeczywistości w postaci programu. Tten wynik masz podany w treści, czy sobie założyłeś? W treści jest napisane, że nauczycielka sprawdza jak jest na początku - raz przejść musi. Być może zamiast typowo używanej zmiennej należy użyć takiego sprawdzenia czy jest już posortowane realizowanego jako pętla. W sumie to jest trochę dziwne - skoro nauczycielka raz przeszła i nikogo nie przestawiła już nie musi sprawdzać/patrzeć.
komentarz 14 marca przez viktor23 Nowicjusz (130 p.)
Te liczby to jak po sprawdzeniu na stronie internetowej, takiej edukacyjnej w mojej szkole, jak wysłałem to pokazało, że takiego problemu program nie rozwiązał poprawnie. Jakoś sobie już z tym poradzę. Dziękuję Panu bardzo za poprowadzenie i pomoc w tym problemie.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 335 wizyt
0 głosów
1 odpowiedź 160 wizyt
0 głosów
1 odpowiedź 160 wizyt
pytanie zadane 29 października 2017 w Java przez barteku12 Obywatel (1,340 p.)

92,579 zapytań

141,427 odpowiedzi

319,654 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...