/*Per realitzar l'algorisme de Radix Sort ens hem cenyit a les indicacions de l'enunciat. Podem veure que es tracta d'un algoritme molt eficient temporalment, pero no tant eficient espaialment. El cost total de l'algoritme es simplement buidar i omplir una cua tantes vegades com caracters tinguin les paraules, i recorrer una cua te cost Theta(n) per tant, si considerem "m" el nombre de caracters de la paraula, el cost seria: má(Theta(n)) que asimpoticament = Theta(n) */ #include #include using namespace std; /*Creem una cua principal Q on tindrem totes les paraules inicialment*/ queue Q; /*Creem una cua per a cada caracter possible*/ queue a; queue b; queue c; queue d; queue e; queue f; queue g; queue h; queue i; queue j; queue k; queue l; queue m; queue n; queue o; queue p; queue q; queue r; queue s; queue t; queue u; queue v; queue w; queue x; queue y; queue z; int main() { string str; string aux; int ip, jp; ip=0; jp=0; getline(cin, str); //obtenim la lletra de l'entrada estandard while (jp<(str.size())&&(str.at(jp)!=' ')) jp++; //busquem el primer espai i ja sabem la mida de les paraules while (ip<(int)str.size()) //mentre no haguem tret totes les paraules { aux=str.substr(ip, jp); //tallem la cadena per obtenir nomes la paraula des de l'inici, jp caracters Q.push(aux); //l'encuem a la cua general Q ip++; //incrementem la ip per saltar-nos l'espai ip+=jp; //li sumem la mida de la paraula per a arribar al primer caracter de la segŸent } while ((jp)!=0) //fem servir la mida de la paraula com a comptador que es decrementa { while (Q.size()!=0) //mentre hi hagi elements a la cua principal { aux=Q.front(); //obtenim la primera paraula de la cua Q.pop(); //la treiem switch(aux.at(jp-1)) //depenent de l'ultima lletra a la posicio jp-1 fiquem en una cua o altre { case 'a': a.push(aux); break; case 'b': b.push(aux); break; case 'c': c.push(aux); break; case 'd': d.push(aux); break; case 'e': e.push(aux); break; case 'f': f.push(aux); break; case 'g': g.push(aux); break; case 'h': h.push(aux); break; case 'i': i.push(aux); break; case 'j': j.push(aux); break; case 'k': k.push(aux); break; case 'l': l.push(aux); break; case 'm': m.push(aux); break; case 'n': n.push(aux); break; case 'o': o.push(aux); break; case 'p': p.push(aux); break; case 'q': q.push(aux); break; case 'r': r.push(aux); break; case 's': s.push(aux); break; case 't': t.push(aux); break; case 'u': u.push(aux); break; case 'v': v.push(aux); break; case 'w': w.push(aux); break; case 'x': x.push(aux); break; case 'y': y.push(aux); break; case 'z': z.push(aux); break; } } /*Un cop hem buidat la cua principal, anem passant alfabeticament les paraules de les cues auxiliars a la cua principal*/ while (a.size()!=0) {Q.push(a.front()); a.pop();} while (b.size()!=0) {Q.push(b.front()); b.pop();} while (c.size()!=0) {Q.push(c.front()); c.pop();} while (d.size()!=0) {Q.push(d.front()); d.pop();} while (e.size()!=0) {Q.push(e.front()); e.pop();} while (f.size()!=0) {Q.push(f.front()); f.pop();} while (g.size()!=0) {Q.push(g.front()); g.pop();} while (h.size()!=0) {Q.push(h.front()); h.pop();} while (i.size()!=0) {Q.push(i.front()); i.pop();} while (j.size()!=0) {Q.push(j.front()); j.pop();} while (k.size()!=0) {Q.push(k.front()); k.pop();} while (l.size()!=0) {Q.push(l.front()); l.pop();} while (m.size()!=0) {Q.push(m.front()); m.pop();} while (n.size()!=0) {Q.push(n.front()); n.pop();} while (o.size()!=0) {Q.push(o.front()); o.pop();} while (p.size()!=0) {Q.push(p.front()); p.pop();} while (q.size()!=0) {Q.push(q.front()); q.pop();} while (r.size()!=0) {Q.push(r.front()); r.pop();} while (s.size()!=0) {Q.push(s.front()); s.pop();} while (t.size()!=0) {Q.push(t.front()); t.pop();} while (u.size()!=0) {Q.push(u.front()); u.pop();} while (v.size()!=0) {Q.push(v.front()); v.pop();} while (w.size()!=0) {Q.push(w.front()); w.pop();} while (x.size()!=0) {Q.push(x.front()); x.pop();} while (y.size()!=0) {Q.push(y.front()); y.pop();} while (z.size()!=0) {Q.push(z.front()); z.pop();} jp--; } //Llistem totes les paraules de la cua while (Q.size()!=0) { cout << Q.front(); if (Q.size()!=1) cout << " "; //per temes de format del jutge, l'ultima paraula no ha d'escriure un espai... Q.pop(); } cout << endl; }