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

    Problema procedura partition

    Nell'algoritmo Quicksort ci si serve della procedura partition, l'ho anche cercata su google, ma non mi č chiaro a cosa serva e soprattuto come funzioni, non č che potreste con un breve codice commentato farmi capire?

  2. #2
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    il partition č il cuore del quicksort, il concetto č quello di mettere i numeri pił grandi del pivot a destra e quilli pił piccoli a sinistra del pivot stesso in un sottoinsieme di un vettore


    codice:
    private int partition(T[] array, int lo, int hi, int pivotIndex)
    {
       T pivotValue = array[ pivotIndex ];
     
       swap(array, pivotIndex, hi); //send pivot item to the back
     
       int index = lo; //keep track of where the front ends
     
       for (int i = lo; i < hi; i++) //check from the front to the back
       {
          //swap if the current value is less than the pivot
          if ( (array[i]).compareTo(pivotValue) <= 0 ) 
          {
             swap(array, i, index);
             index++;
          }
       }
     
       swap(array, hi, index); //put pivot item in the middle
     
       return index;
    }

    piccolo esempio supponiamo di avere hi=10 low=5 pivotIndex=6

    la parte dell'array che andiamo a considerare č quindi quella che va dall'indice 5 all'indice 10. Il pivot deve ovviamente ricadere all'interno dell'intervallo e deve essere scelto casualmente se possibile

    quindi supponiamo che il vettore sia cosģ fatto

    codice:
    Vett    34 67 102 11 112 66
    
    indici   5    6   7    8   9   10
    il pivot č il numero con indice 6 quindi il numero 67 che andremo a scambiare con l'ultimo elemento del vettore

    codice:
    Vett    34 66 102 11 112 67
    
    indici   5    6   7    8   9   10
    ora partendo dall'indice minore hi=i=index=5 andiamo a confroontare i numeri con il pivot

    34 č minore di 67 quindi scabiamo il numero con indice i con quello con indice index in questo caso č lo stesso (i=index=5) quindi rimane tutto come č incrementiamo i e index che vanno a 6

    66 č minore di 67 ripetiamo la stessa cosa anche in questo caso i=index quindi lo scambio lascia le cose invariate incrementiamo sia index che i che vanno a 7

    102 č maggiore di 67 quindi non effettuiamo nessuno scambio e incrementiamo solo i che va a 8

    11 č minore si 67 quindi invertiamo i valori di indice 7 e 8

    codice:
    Vett    34 66 11  102 112 67
    
    indici   5    6   7    8   9   10
    ed incrementiamo sia i che index i=9 e index=8

    112>67 quindi non effettuiamo nessuno scambio

    siamo arrivati alla fine del sottoinsieme non ci resta che scambiare il pivot con l'elemento di indice index=8

    codice:
    Vett    34 66 11  67 112 102
    
    indici   5    6   7    8   9   10
    si puņ notare che gli elementi minori di 67 sono a sinistra e quelli maggiori a destra anche se il vettore non č ordinato

    in pratica il pivot č al posto giusto nell'ordinamento, ora basta ripetere l'operazione per i 2 sottoinsiemi (34,66,11) e (112,102) ovvero eseguire
    partition(Vet,5,7,indexPivot) con indexPivot preso a caso fra 5,6 e 7
    partition(Vet,9,10,indexPivot) con indexPivot preso a caso fra 9 e 10

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.