Aiuto esercizio array

di il
8 risposte

Aiuto esercizio array

Buongiorno a tutti, in rete mi è capitato di trovare questo esercizio:
"Genera casualmente N numeri, scegli casualmente un elemento del vettore e quindi effettua la partizione dell’array
rispetto a quell’elemento (cioè elabora il vettore in modo tale che tutti gli elementi a sinistra dell’elemento scelto siano
minori o, al limite, uguali, mentre tutti gli elementi a destra siano sempre maggiori)."
Sembrava banale, ma mi sono sbagliato, ovvero riesco a farlo solo usando un array d'appoggio. Ma se voglio farlo scambiando semplicemente gli elementi sullo stesso array non riesco a farlo.

Questo è il mio codice:

#include <iostream>
#include <ctime>
using namespace std;

int main()
{
    
    
    srand((unsigned)time(NULL));
    int vet[10];
    for(int i=0; i<10; i++){
        vet[i]=rand()%60+1;
    }
    
    for(int i=0; i<10; i++){
        cout<<vet[i]<<" ";
    }
    cout<<endl;
    int a=rand()%10;
    
     for(int i=0; i<10; i++){
     	if(vet[i]<vet[a]){
                swap(vet[i], vet[a]);
            }
     }
    
    for(int i=0; i<10; i++){
        cout<<vet[i]<<" ";
    }
     return 0;
}

8 Risposte

  • Re: Aiuto esercizio array

    Il problema non mi sembra ben definito.

    Se scegli l'elemento di posizione o l'elemento di posizione 9 che si fa?
    E se gli elementi sono tutti maggiori o tutti minori?
  • Re: Aiuto esercizio array

    oregon ha scritto:


    Il problema non mi sembra ben definito.

    Se scegli l'elemento di posizione o l'elemento di posizione 9 che si fa?
    E se gli elementi sono tutti maggiori o tutti minori?
    Prendiamo un array di esempio:
    int vet[10]={5, 4, 7, 2, 6, 9, 8, 1, 3};
    estraggo ad esempio la posizione 2 quindi 7.
    Se ho capito bene ora dovrebbe accadere questo:
    confronta la posizione 2 con la 0. 7 è più grande di 5 quindi non succede nulla.
    Quindi si passa al confronto successivo: 7 è più grande di 4 non cambia nulla.
    Si passa a confrontare 7 con 2, due piè piccolo di 7 e quindi si scambiano di posizione:
    5-4-2-7-6-9-8-4-1-3... continuando così per tutto l'array.
    Ovviamente se casualmente i valori sono già in ordine rispetto al valore estratto non scambia nulla, quindi il problema dell'ultima posizione non dovrebbe esserci.

    Ovviamente l'ordine finale, deve rimanere disordinato altrimenti basterebbe fare un banale bubble sort.
  • Re: Aiuto esercizio array

    Metti il 7 nella posizione zero, poi scorri l'array e quando trovi un numero minore o uguale a 7 lo metti in posizione zero spostando gli altri a destra
  • Re: Aiuto esercizio array

    Weierstrass ha scritto:


    Metti il 7 nella posizione zero, poi scorri l'array e quando trovi un numero minore o uguale a 7 lo metti in posizione zero spostando gli altri a destra
    Ho provato come hai detto ma non funziona
    
    #include <iostream>
    #include <ctime>
    using namespace std;
    
    int main()
    {
        
        
        srand((unsigned)time(NULL));
        int vet[10];
        for(int i=0; i<10; i++){
            vet[i]=rand()%60+1;
        }
        
        for(int i=0; i<10; i++){
            cout<<vet[i]<<" ";
        }
        cout<<endl;
        int a=rand()%10;
        cout<<a<<endl;
        
        int appo=vet[a];
        vet[a]=vet[0];
        vet[0]=appo;
         
        for(int i=0; i<10; i++){
            if(vet[i]<=vet[a]){
             appo=vet[i];
             vet[i]=vet[0];
             vet[0]=appo;
               
            }
            vet[i]=vet[i+1];
        } 
         
        for(int i=0; i<10; i++){
            cout<<vet[i]<<" ";
        }
         return 0;
    }
    
    Per sono sicuro che ho sbagliato io l'algoritmo.
  • Re: Aiuto esercizio array

    Per spostarli tutti serve un for dentro il for.
  • Re: Aiuto esercizio array

    Weierstrass ha scritto:


    Per spostarli tutti serve un for dentro il for.
    Se l'errore algoritmico che ho commesso prima è solo l'assenza di un cliclo for, seguendo il tuo consiglio non funge ugualmente:
    
    
     for(int i=0; i<10; i++){
            for(int j=i+1; j<10; j++){
            if(vet[i]<=vet[a]){
                
             appo=vet[i];
             vet[i]=vet[0];
             vet[0]=appo;
            }
            vet[i]=vet[i+1];
            }
          
        } 
  • Re: Aiuto esercizio array

    
    #include <iostream>
    #include <ctime>
    using namespace std;
    
    int main(){
        srand((unsigned)time(NULL));
        int i, j, vet[10];
        for(i=0; i<10; i++){
            vet[i]=rand()%60+1;
            cout<<vet[i]<<" ";
        }
        cout<<endl;
        
        int a=rand()%10;
        cout<<a<<endl;
        
        int appo=vet[a];
        vet[a]=vet[0];
        vet[0]=appo;
        a=vet[0];
        cout<<a<<endl;
         
        for(i=1; i<10; i++)
            if(vet[i]<=a){
                appo=vet[i];
                for(j=i;j>0;j--)
                    vet[j]=vet[j-1];
                vet[0]=appo;
            }
         
        for(i=0; i<10; i++)
            cout<<vet[i]<<" ";
        
        return 0;
    }
    
  • Re: Aiuto esercizio array

    Weierstrass ha scritto:


    
    #include <iostream>
    #include <ctime>
    using namespace std;
    
    int main(){
        srand((unsigned)time(NULL));
        int i, j, vet[10];
        for(i=0; i<10; i++){
            vet[i]=rand()%60+1;
            cout<<vet[i]<<" ";
        }
        cout<<endl;
        
        int a=rand()%10;
        cout<<a<<endl;
        
        int appo=vet[a];
        vet[a]=vet[0];
        vet[0]=appo;
        a=vet[0];
        cout<<a<<endl;
         
        for(i=1; i<10; i++)
            if(vet[i]<=a){
                appo=vet[i];
                for(j=i;j>0;j--)
                    vet[j]=vet[j-1];
                vet[0]=appo;
            }
         
        for(i=0; i<10; i++)
            cout<<vet[i]<<" ";
        
        return 0;
    }
    
    Tecnicamente l'algoritmo funziona, però il problema chiede la partizione dell'array, rispetto al valore dell'indice non rispetto all'indice stesso.. tipo vedo il valore dentro vet[3] e scambio gli elementi in cofronto a tale valore. Invece con tuo esempio scambia confrontandoli con il 3.

    Aggiornamento: non mi ero accorto di un' ulteriore riga di codice da te corretta. Il programma funziona correttamente. Grazie per l'aiuto
Devi accedere o registrarti per scrivere nel forum
8 risposte