Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Algoritmo di ordinamento... che non ordina?

    Salve a tutti!

    Ho scritto una mini porzione di codice per riordinare tramite un ordinamento Bubble un array passato in ingresso al metodo stesso. Ma non capisco come mai l'array... non venga ordinato! Cosa sto sbagliando? Potreste aiutarmi a capire meglio? Grazie mille!

    codice:
    public class BubbleSortClass {
    
       // METODI AUSILIARI PRIVATI
        private static void bubbleSort(int[] v)
        {
            int n = v.length;
            boolean ordinato = false;
            for(int i = 0; i < n-1 && !ordinato; i++)
            {
                ordinato = true;
                
                for(int j=n-1; j<i; j--)
                
                    if(v[j-1] > v[j]) 
                    {
                        int temp = v[j-1];
                        v[j-1] = v[j];
                        v[j] = temp;
                        ordinato = false;
                
                }
            }
        }
                                                                                    
            private static void stampaArray(int[] v)    
        {
            for(int i = 0; i<v.length; i++)
                System.out.println(v[i]);
        }
        
    
        // MAIN
        public static void main(String[] args) {
            
            int[] vettore = {3, 2, 6, 5, 4};
            
            System.out.println("Prima di bubbleSort() il vettore è: ");
            stampaArray(vettore);
            
            bubbleSort(vettore);
            System.out.println("Dopo bubbleSort() il vettore è: ");
            stampaArray(vettore);
    
        }
    
    }
    I'm going under (going under)
    Drowning in you (drowning in you)
    I'm falling forever (falling forever)
    I've got to break through
    I'm going under

    { GOING UNDER - Evanescence }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Osserviamo bene il for interno:

    codice:
    for(int j=n-1; j<i; j--)

    Alla prima iterazione del for più esterno la variabile "i" vale 0. Supponendo di avere un array di 10 elementi, "j" vale 9, quindi j non sarà mai minore di "i", quindi non entra nel for, quindi la variabile "ordinato" vale true e nessuno la imposta a false, quindi non eseguirà mai il secondo giro del ciclo for più esterno (e nemmeno nessuno di quello interno), quindi l'algoritmo termina subito senza fare nulla.

    Da rivedere un po' quegli indici.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Grazie per la risposta, LeleFT!
    In effetti non avevo minimamente considerato questa cosa. Ho proprio scritto tutto al contrario!
    Ho modificato, e questa versione qui sotto funziona Ho supposto di decrementare l'ultimo indice (i) fino al valore di indice = 1, mentre il valore dell'indice j (che sarebbe il penultimo puntatore) fino al valore 0, essendo quello che, diciamo, scorre "per primo" verso la fine dell'array, a ritroso. Che ne pensi? A girare gira, è corretto da un punto di vista logico?
    Ciao!

    codice:
        private static void bubbleSort(int[] v)
        {
            int n = v.length;
            boolean ordinato = false;
            for(int i = n; i !=1 && !ordinato; i--)
            {
                ordinato = true;
                
                for(int j=n-1; j !=0; j--)
                
                    if(v[j-1] > v[j]) 
                    {
                        int temp = v[j-1];
                        v[j-1] = v[j];
                        v[j] = temp;
                        ordinato = false;
                }
            }
        }
    I'm going under (going under)
    Drowning in you (drowning in you)
    I'm falling forever (falling forever)
    I've got to break through
    I'm going under

    { GOING UNDER - Evanescence }

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.