Esercizio in C++ (ordinamento vettore)

di il
1 risposte

Esercizio in C++ (ordinamento vettore)

Buongiorno, mi sono imbattuto nella risoluzione di questo esercizio:
"Leggi un vettore e ordina i suoi elementi in base alla frequenza con cui sono presenti (in ordine crescente) e stampalo.
Ad esempio: 243223 --> 433222".
A prima vista mi sembrava banale invece mi ha preso un po' di tempo.
Riporto il mio codice abbastanza articolato.
La mia domanda è: esiste un modo più semplice ed elegante per risolverlo? (con più semplice intendo più corto )
Grazie a tutti.

#include <iostream>
#define DM 100
using namespace std;
int conta(int V[DM], int dim, int y){ // passo il vettore e un suo elemento
 e mi dice quante volte quel elemento è presente (frequenza)
    int cont=0;
    for(int i=0; i<dim; i++){
        if(V[i]==V[y])
            cont++;
    }
    return cont;
}
void stampa(int a, int b){ //stampa un numero (a) b volte (frequenza)
    for(int i=0; i<b; i++){
        cout<<a;
    } 
}
int main(){
    int V[DM], dim, freq[DM][DM],cont_r;
    do{
        cout<<"Inserisci la dimensione del vettore (da 1 a 100)"<<endl;
        cin>>dim;
    }while(dim<1 || dim> DM);
    for(int i=0; i<dim; i++){
        cout<<"Inserisci l'elemento in posizione "<<i<<endl;
        cin>>V[i]; 
     }
    for(int i=0; i<dim; i++){ //creo una matrice con due colonne, la prima
     il valore dell'elemento, la seconda la sua frequenza.
            freq[i][0]=V[i];
            freq[i][1]=conta(V,dim,i);
            cont_r++;
    }

    int min,temp1,temp2;

    for(int i=0; i<cont_r-1; i++){ //ordino gli elementi della matrice in
     ordine crescente in base alla colonna delle frequenze
     
    min = i;
    for(int j=i+1; j<cont_r; j++)
      if(freq[j][1] < freq[min][1])
         min = j;

    temp1=freq[min][1];
    freq[min][1]=freq[i][1];
    freq[i][1]=temp1;
    temp2=freq[min][0];

    freq[min][0]=freq[i][0];
    freq[i][0]=temp2;
    }
    for(int i=0; i<cont_r; i++){ // stampo il vettore non ordinato
        cout<<V[i];
    }
    cout<<"--->";
    int p=0;
    for(int i=0; i<cont_r; i++){
        for(int j=0; j<i; j++){ // evito di stampare due volte lo stesso
         elemento
            if(freq[i][0]==freq[j][0]){
                p=1;
            } 
        } 
        if(p==0)//stampo il vettore ordinato
            stampa(freq[i][0], freq[i][1]);
     p=0;
     }
return 0; 
}
[\code]

1 Risposte

Devi accedere o registrarti per scrivere nel forum
1 risposte