| 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 #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;
 }
 
 | 
|  | 
| 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.  for( int j = 1; j < ilosc; j++ ) {if(( Tab[ j ] == Tab[ j - 1 ] ) &&( Tab[ j ] != Tab[ j + 1 ] ) ) {
 std::cout << Tab[ j ] << std::endl;
 }
 }
…? | 
|  | 
| 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.) | 
|  | 
| 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 . | 
|  | 
| 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 :) #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;
 }
 
 | 
|  | 
| 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....  #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). | 
|  | 
| 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: j = 0:if(( Tab[ 0 ] == Tab[ - 1 ] ) &&(( 1 == ilosc ) ||( Tab[ 0 ] != Tab[ 1 ] ) )
 
a co się kryje pod Tab[-1] możesz sprawdzić: std::cout << "element -1: " << Tab[ - 1 ];
 | 
|  | 
| 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.
 | 
|  | 
| « 1 » |