Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Sortowanie bąbelkowe

Ostatnio zmodyfikowano 2017-01-07 12:43
Autor Wiadomość
Squashu
Temat założony przez niniejszego użytkownika
[C++] Sortowanie bąbelkowe
» 2017-01-06 22:20:01
Witam, mam dosc specyficzny problem z moim algorytem sortowania. Przy wpisaniu do tablicy liczby 1004, program wyrzuca mi z powrotem 582 - nie mogę zrozumieć gdzie popełniam błąd.

Treść zadania

W miasteczku Macondo co tydzień odbywa się loteria z cennymi nagrodami. Sprzedawane losy mają przypisane numery od 1 do 100 000 000. Losowany jest tylko jeden zwycięski kupon. Niektórzy mieszkańcy podejrzewają, że maszyna losująca nie jest do końca uczciwa i pewne numery mają większe szanse na wygraną. Sprawdź, czy wyniki dotychczasowych losowań wskazują na taką możliwość.

Wejście

Pierwsza linia wejścia zawiera liczbę n (1 <= n <= 100 000) dotychczasowych losowań. W kolejnych n liniach podane są numery kuponów, które wygrały w poszczególnych losowaniach (liczby całkowite z zakresu od 1 do 100 000 000).

Wyjście

Wypisz posortowane rosnąco numery, które zostały wylosowane więcej niż jeden raz.

Przykład

Wejście:
7
1
3
8
3
1
3
1004

Wyjście:
1
3

C/C++
#include <iostream>

void zmiana( int & a, int & b ) {
    int temp = a;
    a = b;
    b = temp;
}

void sort_b( int Tab[], int a ) {
    for( int i = 0; i < a; i++ ) {
        for( int j = a; j > i; j-- ) {
            if( Tab[ j ] < Tab[ j - 1 ] ) {
                zmiana( Tab[ j ], Tab[ j - 1 ] );
            }
        }
    }
}

int main() {
    int ilosc;
    std::cin >> ilosc;
    int Tab[ ilosc ];
    for( int j = 0; j < ilosc; j++ ) {
        std::cin >> Tab[ j ];
    }
    sort_b( Tab, ilosc );
    for( int j = 0; j < ilosc; j++ ) {
        std::cout << Tab[ j ] << " ";
    }
    std::cout << std::endl;
    for( int j = 1; j < ilosc; j++ ) {
        if(( Tab[ j ] == Tab[ j - 1 ] ) &&( Tab[ j ] != Tab[ j + 1 ] ) ) {
            std::cout << Tab[ j ] << std::endl;
        }
    }
    return 0;
}
P-156136
Gibas11
» 2017-01-06 22:49:04
Masz nałożone jakieś ograniczenia co do wykorzystania biblioteki standardowej? Jeśli nie to raczej źle do tego podszedłeś, całość można zmieścić w ~18 linijkach właściwego kodu bez przejmowania się zbędną pracą, wszystkie zadania typu sortowanie czy usuwanie duplikatów możesz oddelegować do do gotowców w STL.

//edit:
1.
int Tab[ ilosc ];
 To jest niezgodne ze standardem C++, zastąp tą tablicę
std::vector
 albo dynamicznie alokuj pamięć operatorem
new
.
2.
C/C++
for( int j = 1; j < ilosc; j++ ) {
    if(( Tab[ j ] == Tab[ j - 1 ] ) &&( Tab[ j ] != Tab[ j + 1 ] ) ) {
        std::cout << Tab[ j ] << std::endl;
    }
}
…?
P-156138
michal11
» 2017-01-06 23:54:54
To jest chyba spoj (albo cos podobnego) wiec raczej nie masz ograniczeń na stosowanie biblioteki standardowej, dlatego podam alternatywne, prostsze rozwiązanie które możesz zastosować. Dane wczytuj do std::set żeby wykluczać od razu duplikaty, przekopiuj dane do std::vector, użyj std::sort i wypisz vector na wyjście, korzystając z std::copy można to zrobić praktycznie w 4 liniach kodu (bez deklaracji zmiennych, bibliotek itd.)
P-156144
Gibas11
» 2017-01-07 00:00:27
@up
Sam chciałem to tak napisać, ale przy wczytaniu od razu do
std::set
 nie ma jak usunąć tego, co występuje tylko raz. Ja zrobiłem to tak:
- Wczytanie zmiennych do
std::vector
.
- Usunięcie liczb, które występują tylko raz (
std::remove_if
 i
std::count_if
).
- Skopiowanie całości do
std::set
, on automatycznie usunął duplikaty i posortował dane.
- Wypisanie przez
std::copy
 i
std::ostream_iterator
.
P-156146
Squashu
Temat założony przez niniejszego użytkownika
» 2017-01-07 00:39:11
1. Struktury danych dowolne - nie możemy stosować tylko "gotowcow"
2. Poprawiłem
3. Problem znikł, tablica jest już dobrze sortowana - niby wszystko działa ale sprawdzarka ciągle odrzuca.
4. Dziękuje za dotychczasową pomoc :)

C/C++
#include <iostream>
#include <vector>

void zmiana( int & a, int & b ) {
    int temp = a;
    a = b;
    b = temp;
}

void sort_b( std::vector < int >& Tab ) {
    for( int i = 0; i < Tab.size(); i++ ) {
        for( int j = Tab.size(); j > i; j-- ) {
            if( Tab[ j ] < Tab[ j - 1 ] ) {
                zmiana( Tab[ j ], Tab[ j - 1 ] );
            }
        }
    }
}

int main() {
    int ilosc, temp;
    std::cin >> ilosc;
    std::vector < int > Tab;
    for( int j = 0; j < ilosc; j++ ) {
        std::cin >> temp;
        Tab.push_back( temp );
    }
    sort_b( Tab );
    for( int j = 0; j < ilosc; j++ ) {
        if(( Tab[ j ] == Tab[ j - 1 ] ) &&(( j + 1 == ilosc ) ||( Tab[ j ] != Tab[ j + 1 ] ) ) ) {
            std::cout << Tab[ j ] << std::endl;
        }
    }
    return 0;
}
P-156152
mokrowski
» 2017-01-07 01:36:43
Nie wiem czy spełnia "warunki sprawdzarki" bo nie podałeś linku do zadania a nie ukrywam że nie chce mi się szukać :-/
Dość że tu masz (jakieś) rozwiązane na algorytmach do postudiowania....
C/C++
#include <vector>
#include <algorithm>

using namespace std;

void read_and_show_repeated( size_t count ) {
    vector < unsigned long > vec;
    copy_n( istream_iterator < unsigned long >( cin ), count, vec.begin() );
    sort( vec.begin(), vec.end() );
    auto iter = vec.begin();
    while( iter != vec.end() ) {
        auto repeated_value_iter = adjacent_find( iter, vec.begin() );
        if( repeated_value_iter != vec.end() ) {
            cout << * repeated_value_iter << '\n';
        } else {
            break;
        }
        while(( ++iter != vec.end() ) and( * iter == * repeated_value_iter ) );
       
    }
}

int main() {
    size_t count;
    cin >> count;
    read_and_show_repeated( count );
}

PS. Właśnie poszukałem.. Do tego zadania bubble sort nie spełnia warunków dobrego rozwiązania. Zaimplementuj quick sort (o ile znalazłem To zadanie).
P-156154
czaffik
» 2017-01-07 02:16:07
Nie będę podawał jak rozwiązać to zadanie, masz dużo dobrych rad.
Twój warunek może i działa ale jest jeden mały błąd, w pierwszym obiegu pętli wektor wyjdzie poza zakres:
C/C++
j = 0:
if(( Tab[ 0 ] == Tab[ - 1 ] ) &&(( 1 == ilosc ) ||( Tab[ 0 ] != Tab[ 1 ] ) )
a co się kryje pod Tab[-1] możesz sprawdzić:
C/C++
std::cout << "element -1: " << Tab[ - 1 ];
P-156156
Squashu
Temat założony przez niniejszego użytkownika
» 2017-01-07 12:43:25
@up
poprawiłem błąd w pętli, faktycznie nie zauważyłem, że zaczynam od 0. Dziękuje

@mokrowski

Dziękuje Ci bardzo, faktycznie po zmianie algorytmu na qsort sprawdzarka przyjęła wszystko

Temat zamykam, dziękuje za pomoc.
P-156163
« 1 »
  Strona 1 z 1