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

question-closed C++ Sortowanie kubełkowe na wektorach

Fiszki IT
Fiszki IT
+1 głos
109 wizyt
pytanie zadane 12 lutego w C i C++ przez Kamirru9 Początkujący (270 p.)
zamknięte 12 lutego przez Kamirru9

Kod raz zadziała, raz nie zadziała. Jeśli zadziała to wypluwa błędne wyniki sad.
Próbowałem sam naprawiać, ale nie wyszło(stąd moje komentarze w trakcie kodu).
Pisałem wcześniej w JavaScript i tam konkatenacja była dziecinnie prosa i zawsze wszystko działało, tutaj też próbowałem z to_string().., z tym coś nie działało, bo chciałem zrobić coś takiego {k.empty()? k.push_back(tab[i]): seb(k,tab[i]);}; dla k:= "k0"+act, zamiast switch(act). Tak samo analogicznie dla późniejszego połącznia wszystkiego do jednej tablicy.
Proszę o dwie rzeczy:

  1. Naprawę / wskazanie błędu w samym algorytmie (aby nie wsypywał się i dawał dobre wyniki).
  2. Sposób jak mam zapisać poprawie konkatenację w moim przypadku w celu skrócenia kodu.

 Programuje w Code::Blocks 20.03.
Z góry dziękuję za pomoc smiley.
 

#include <iostream>
#include <time.h>
#include <cstdlib>
#include <vector>

using namespace std;

int q;
vector <float> tab,k00,k01,k02,k03,k04,k05,k06,k07,k08,k09;

void showw(vector <float> &tab){
    for(int i=0;i<tab.size();i++)
        cout << " "<<tab[i]<<" " << endl;
}
void seb(vector <float> &tb,float x){
    for(int i=0;i<tab.size();i++)
        if(tb[i]>=x)
            tb.insert( tb.begin() + (i+1), x );
}

void sk(vector <float> &tab, vector <float> &k00, vector <float> &k01, vector <float> &k02, vector <float> &k03, vector <float> &k04, vector <float> &k05, vector <float> &k06, vector <float> &k07, vector <float> &k08, vector <float> &k09){
    for(int i=0;i<tab.size();i++){
        int act=tab[i]*10;
        ///cout<<act<<endl;
        switch(act){
        case 0: k00.empty()? k00.push_back(tab[i]): seb(k00,tab[i]);
        case 1: k01.empty()? k01.push_back(tab[i]): seb(k01,tab[i]);
        case 2: k02.empty()? k02.push_back(tab[i]): seb(k02,tab[i]);
        case 3: k03.empty()? k03.push_back(tab[i]): seb(k03,tab[i]);
        case 4: k04.empty()? k04.push_back(tab[i]): seb(k04,tab[i]);
        case 5: k05.empty()? k05.push_back(tab[i]): seb(k05,tab[i]);
        case 6: k06.empty()? k06.push_back(tab[i]): seb(k06,tab[i]);
        case 7: k07.empty()? k07.push_back(tab[i]): seb(k07,tab[i]);
        case 8: k08.empty()? k08.push_back(tab[i]): seb(k08,tab[i]);
        case 9: k09.empty()? k09.push_back(tab[i]): seb(k09,tab[i]);
        }
    }
    tab.clear();
    tab.insert(tab.begin(), k09.begin(), k09.end());
    tab.insert(tab.begin(), k08.begin(), k08.end());
    tab.insert(tab.begin(), k07.begin(), k07.end());
    tab.insert(tab.begin(), k06.begin(), k06.end());
    tab.insert(tab.begin(), k05.begin(), k05.end());
    tab.insert(tab.begin(), k04.begin(), k04.end());
    tab.insert(tab.begin(), k03.begin(), k03.end());
    tab.insert(tab.begin(), k02.begin(), k02.end());
    tab.insert(tab.begin(), k01.begin(), k01.end());
    tab.insert(tab.begin(), k00.begin(), k00.end());
}

int main()
{
    cout << "Podaj ile elementow? ";
    cin >>q;
    srand(time(0));
    for(int z=0;z<q;z++)
        tab.push_back((rand()%100)/100.0);
    showw(tab);
    sk(tab,k00,k01,k02,k03,k04,k05,k06,k07,k08,k09);
    //cout << " =0 " << endl;
    //showw(k00);
    //cout << " =1 " << endl;
    //showw(k01);
    //cout << " =2 " << endl;
    //showw(k02);
    //cout<<"qq"<<endl;
    showw(tab);
    return 0;
}

 

komentarz zamknięcia: j23 pomógł
komentarz 12 lutego przez j23 Mędrzec (164,140 p.)

W seb masz błąd - pętla bazuje na wielkości tab a nie tb.

Zamiast wyszukiwania liniowego użyj std::lower_bound.

komentarz 12 lutego przez Kamirru9 Początkujący (270 p.)

Naprawa jednego problemu spowodowała inny surprise.

void seb(vector <float> &tab,float x){
    for(int i=0;i<tab.size();i++)
        if(x>=tab[i])
            tab.insert( tab.begin() + (i+1), x );
}

I teraz konsola wypluwa 
 

Podaj ile elementow? 5
 0.86
 0.3
 0.43
 0.89
 0.78
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

Process returned 3 (0x3)   execution time : 3.884 s

 

komentarz 12 lutego przez j23 Mędrzec (164,140 p.)

Tak zrób:

void seb(vector <float> &tab,float x)
{
    for(int i = 0; i < tab.size(); i++)
        if(x < tab[i]) {
            tab.insert(tab.begin() + i, x );
            return;
        }
        
    tab.push_back(x);
}

 

komentarz 12 lutego przez Kamirru9 Początkujący (270 p.)

Fajnie, bo funkcja skróciła zapis switcha:

case 0: seb(k00,tab[i]);

Tylko pozostaje jeszcze problem z nadmiarowością danych 

Podaj ile elementow? 3
 0.92
 0.4
 0.1
 0.1
 0.1
 0.1
 0.1
 0.4
 0.1
 0.4
 0.1
 0.4
 0.1
 0.4
 0.1
 0.4
 0.1
 0.4
 0.92

Process returned 0 (0x0)   execution time : 160.175 s

 

komentarz 12 lutego przez j23 Mędrzec (164,140 p.)
edycja 13 lutego przez j23

Zapomniałeś o break w case'ach.

bo funkcja skróciła zapis switcha:

A propos upraszczania:

void sk(vector <float> &tab)
{
    vector <float> bucket[10];

    for(int i = 0;i < tab.size(); i++) {
        int act = max(min<int>(tab[i] * 10, 9), 0);
        seb(bucket[act], tab[i]);
    }
    
    tab.clear();
    
    for (auto &b : bucket) {
        tab.insert(tab.end(), b.begin(), b.end());
    }
}

 

komentarz 12 lutego przez Kamirru9 Początkujący (270 p.)

Dzięki za pomoc laugh

1 odpowiedź

0 głosów
odpowiedź 12 lutego przez Kamirru9 Początkujący (270 p.)

Podsyłam działający kod wink
I tym samym zamykam temat 

#include <iostream>
#include <time.h>
#include <cstdlib>
#include <vector>

using namespace std;

int q;
vector <float> tab,k00,k01,k02,k03,k04,k05,k06,k07,k08,k09;

void showw(vector <float> &tab){
    for(int i=0;i<tab.size();i++)
        cout << " "<<tab[i]<<" " << endl;
}
void seb(vector <float> &tab,float x)
{
    for(int i = 0; i < tab.size(); i++)
        if(x < tab[i]) {
            tab.insert(tab.begin() + i, x );
            return;
        }
    tab.push_back(x);
}

void sk(vector <float> &tab, vector <float> &k00, vector <float> &k01, vector <float> &k02, vector <float> &k03, vector <float> &k04, vector <float> &k05, vector <float> &k06, vector <float> &k07, vector <float> &k08, vector <float> &k09){
    for(int i=0;i<tab.size();i++){
        int act=tab[i]*10;
        switch(act){
        case 0: seb(k00,tab[i]); break;
        case 1: seb(k01,tab[i]); break;
        case 2: seb(k02,tab[i]); break;
        case 3: seb(k03,tab[i]); break;
        case 4: seb(k04,tab[i]); break;
        case 5: seb(k05,tab[i]); break;
        case 6: seb(k06,tab[i]); break;
        case 7: seb(k07,tab[i]); break;
        case 8: seb(k08,tab[i]); break;
        case 9: seb(k09,tab[i]); break;
        }
    }
    tab.clear();
    tab.insert(tab.begin(), k09.begin(), k09.end());
    tab.insert(tab.begin(), k08.begin(), k08.end());
    tab.insert(tab.begin(), k07.begin(), k07.end());
    tab.insert(tab.begin(), k06.begin(), k06.end());
    tab.insert(tab.begin(), k05.begin(), k05.end());
    tab.insert(tab.begin(), k04.begin(), k04.end());
    tab.insert(tab.begin(), k03.begin(), k03.end());
    tab.insert(tab.begin(), k02.begin(), k02.end());
    tab.insert(tab.begin(), k01.begin(), k01.end());
    tab.insert(tab.begin(), k00.begin(), k00.end());
}

int main()
{
    cout << "Podaj ile elementow? ";
    cin >>q;
    srand(time(0));
    for(int z=0;z<q;z++)
        tab.push_back((rand()%100)/100.0);
    showw(tab);
    sk(tab,k00,k01,k02,k03,k04,k05,k06,k07,k08,k09);
    showw(tab);
    return 0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 158 wizyt
0 głosów
1 odpowiedź 196 wizyt
pytanie zadane 13 czerwca 2020 w C i C++ przez amtrax Dyskutant (8,990 p.)
0 głosów
1 odpowiedź 206 wizyt
pytanie zadane 4 listopada 2017 w C i C++ przez WaterMelon Nowicjusz (120 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

84,702 zapytań

133,503 odpowiedzi

295,887 komentarzy

55,979 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...