• 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

Object Storage Arubacloud
+1 głos
529 wizyt
pytanie zadane 12 lutego 2021 w C i C++ przez Kamirru9 Początkujący (300 p.)
zamknięte 12 lutego 2021 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 2021 przez j23 Mędrzec (194,920 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 2021 przez Kamirru9 Początkujący (300 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 2021 przez j23 Mędrzec (194,920 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 2021 przez Kamirru9 Początkujący (300 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 2021 przez j23 Mędrzec (194,920 p.)
edycja 13 lutego 2021 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 2021 przez Kamirru9 Początkujący (300 p.)

Dzięki za pomoc laugh

1 odpowiedź

0 głosów
odpowiedź 12 lutego 2021 przez Kamirru9 Początkujący (300 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ź 825 wizyt
pytanie zadane 2 lutego 2021 w C i C++ przez Kamirru9 Początkujący (300 p.)
0 głosów
1 odpowiedź 750 wizyt
pytanie zadane 13 czerwca 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)
0 głosów
1 odpowiedź 320 wizyt
pytanie zadane 4 listopada 2017 w C i C++ przez WaterMelon Nowicjusz (120 p.)

92,669 zapytań

141,567 odpowiedzi

320,037 komentarzy

62,034 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

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!

...