Sortowanie 4 liczb w kolejności. Podstawy.

0

Witam. Chciałem napisać program, który posortuje liczby wpisane przez użytkownika. 3 cyfry posortowałem bez problemu, ale teraz chciałem posortować 4+liczb. Liczby mają być w kolejności od najmniejszej do największej. Proszę o wytłumaczenie jak to zrobić poprawnie.

Tutaj kod, który napisałem:

// wymiana 4 zmiennych od najmniejszej do najwiekszej
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int x;
    do
    {
        int a, b, c, d, tmp, tmp1, tmp2, tmp3;
        cout << "Podaj a=";
        cin >> a;
        cout << endl;
        cout << "Podaj b=";
        cin >> b;
        cout << endl;
        cout << "Podaj c=";
        cin >> c;
        cout << endl;
        cout << "Podaj d=";
        cin >> d;
        cout << endl;
        if (d < c)
        {
            c = tmp3;
            c = d;
            d = tmp3;
        }
        if (c < b)
        {
            b = tmp1;
            b = c;
            c = tmp1;
        }
        if (b < a)
        {
            a = tmp2;
            a = b;
            b = tmp2;
        }
        cout << "a=" << a << endl;
        cout << "b=" << b << endl;
        cout << "c=" << c << endl;
        cout << "d=" << d << endl;
        cout << "podaj x" << endl;
        cin >> x;
    } while (x == 1);
    system("pause");
}

Dołączam screena!

1

Korzystaj z formatera: http://format.krzaq.cc
Wstaw kod w <code class="cpp"></code>
Zainteresuj się jakimś algorytmem sortowania, choćby najprostszym bąbelkowym lub przez wstawianie. Jak będziesz miał 5, 6, 100 elementów to też będziesz dodawać kolejne ify?

0

Nie, po prostu robię kolejne ćwiczenia i jeszcze nie dotarłem do sortowania. W ćwiczeniach z if'em było akurat takie i chciałem je zrobić, ale nie wiem jak ;/

1

Z bąbelkowym daj spokój. Zainteresuj się sortowaniem przez wstawianie - jest świetne bo stabilne, a jego złożoność wynosi O(liczba inwersji w sortowanym ciągu). Jeśli liczba tych inwersji jest liniowa, to to sortowanie będzie najszybsze. Nawet quicksort nie potrafi liniowo nic posortować.

1

Ludzie, ludzie, każdy kiedyś przechodził przez sieci sortujące, spokojnie.

@loromax: podejdź do tego powoli, stopniowo. Zacznij od napisania programu sortującego dwie liczby (praktycznie banał), trzy liczby etc. rozpisując wszystko na kartce, a dopiero na sam koniec podchodząc do tego od strony programowania.

Edit: i zapoznaj się z funkcją std::swap, uprości to znacznie Twój kod i zwiększy jego czytelność.

0

Dziękuję za rady. Z pewnością skorzystam :)

1
c=tmp3;
c=d;
d=tmp3

A nie prościej:

swap(c, d);

Funkcja swap zamienia wartości dwóch zmiennych. Do jej użycia możesz musieć dołączyć #include<algorithm> lub #include<utility>.

================================================================

Co się tyczy tematu: jeśli chcesz zrobić sobie ćwiczenie, że sortujesz 4 liczby poprzez same porównania – to świetnie, ale w takim razie nie myśl, że zepsuję Ci ćwiczenie, waląc od razu rozwiązanie ;P

Weź sobie kartkę i zacznij rozpisywać drzewo porównań. Chodzi mi o coś takiego:

user image

Tylko zrób to dla 4 liczb, nie dla 3.

0

Już wiem co robiłem źle i skąd brały się takie dziwne liczby. Zamiast tmp=c, pisałem c=tmp. Ale przy sortowaniu 4 liczb if'ami to jest strasznie dużo roboty. Jest to nieopłacalne kompletnie. Trzeba robić milion założeń. Zaraz zacznę uczyć się jakiejś metody sortowania. Dzięki za pomoc wszystkim.

0

dla czterech szukasz najpierw minimum, więc potem sortujesz trzy, bo wiadomo że czwarty najmniejszy.

if( a > b ) a :=: b; // swap
if( c > d ) c :=: d;

if( a > c ) a :=: c;

teraz a jest już najmniejszy... robisz trzy pozostałe.

1 użytkowników online, w tym zalogowanych: 0, gości: 1