Algoritmo di ordinamento

di il
3 risposte

Algoritmo di ordinamento

Ciao ho pensato e implementato un algoritmo per l'ordinamento di un array..vorrei presentarlo e vi chiedo il vostro parere:
public class Ordinamento{
	/**Metodo: ordina.
	 * @param a array di interi.
	 * @param n grandezza dell'array.
	 * @return array ordinato.
	 */
	public int[] ordina(int[] a,int n){
	    int max=a[0],min=a[0];
	    int j=n-1;
	    for(int i=0;i<n;i++){
	    	min=minimo(a,i,j);
	    	max=massimo(a,i,j);
	    	a=scambio(a,i,j,min,max);
	    }//for i. 
	    return a;
	}//ordina.
	/**Metodo: minimo.
	 * @param a array di interi.
	 * @param i offset da sinistra.
	 * @param j offset da destra.
	 * @return il minimo valore contenuto nell'array tra i due offset.
	 */
	private int minimo(int[] a,int i,int j){
		int min=a[i];
		for(i=i+1;i<=j;i++){
			if(a[i]<min){
			    min=a[i];
			}//if.
		}//for i.
		return min;
	}//minimo.
	/**Metodo: massimo.
	 * @param a array di interi.
	 * @param i offset da sinistra.
	 * @param j offset da destra.
	 * @return il massimo valore contenuto nell'array tra i due offset.
	 */
	private int massimo(int[] a,int i,int j){
		int max=a[i];
		for(i=i+1;i<=j;i++){
			if(a[i]>max){
				max=a[i];
			}//if.
		}//for i.
		return max;
	}//massimo.
	/**Metodo: scambio.
	 * @param a array di interi.
	 * @param i offset da sinistra.
	 * @param j offset da destra.
	 * @param min il valore minimo trovato precedentemente.
	 * @param max il valore massimo trovato precedentemente.
	 * @return l'array con gli elementi scambiati.
	 */
	private int[] scambio(int[] a,int i,int j,int min,int max){
		int iMax,iMin,temp;	
		iMax=cercaIndice(a,i,j,max);
		iMin=cercaIndice(a,i,j,min);
		temp=a[i];
		a[i]=a[iMin];
		a[iMin]=temp;
		temp=a[j];
		a[j]=a[iMax];
		a[iMax]=temp;
		return a;
	}//scambio.
	/**Metodo: cercaIndice.
	 * @param a array di interi.
	 * @param i offset da sinistra.
	 * @param j offset da destra.
	 * @param num il numero di cui si vuole trovare l'indice.
	 * @return l'indice del numero.
	 */
	private int cercaIndice(int[] a,int i,int j,int num){
		for(i=i;i<=j;i++){
			if(a[i]==num){
				return i;
			}//if.
		}//for i.
	    return i;
	}//cercaIndice.
}//Ordinamento.

3 Risposte

  • Re: Algoritmo di ordinamento

    Scusami, ma a cosa servirebbe. Ad ordinare un array di interi ?
    Non basterebbe in teoria questo :
    
            // Questa prima istruzione serve solo per ottenere un arrai di interi precaricato.
            // Nella realtà dovresti avere già un arrai di interi da ordinare .... 
            int[] aInt = new int[]{1,9,2,8,3,7,4,6,5};
     
            // Dopo questa chiamata aInt è ordinato.  
            Arrays.sort(aInt);
    
  • Re: Algoritmo di ordinamento

    Lo so esistono gia dei metodi fatti pero quello dell'ordinamento e' un algoritmo molto ricercato e si e' sepre cercato di migliorarlo..cio che intendo fare io..cmq questo codice e' per interi pero posso modificrlo con niente e farlo anke per altri tipi di dati
  • Re: Algoritmo di ordinamento

    Ciao. Appena ho visto il tuo algoritmo subito non mi ha convinto il metodo cercaIndice...allora ho provato ad "attaccarlo" con alcuni input e con il seguente
    int a [] = {0,2,0,2,0,2,0,2,0,2,0,2};
    mi restituisce [0,2,0,0,0,0,2,2,2,2,2,0].
    Secondo me non puoi fidarti di questo confronto qui
    
    if(a[i]==num){
          return i;
    }//if.
    
    Fossero stati oggetti secondo me avresti potuto confrontare il riferimento e in quel caso forse il metodo ordina sarebbe terminato correttamente...non ho avuto il tempo di verificare questa cosa.
    Così com'è quindi non credo vada bene.
    Poi quando si da un parere su un algoritmo se ne analizza la sua complessità.
    Gli algoritmi di ordinamento ottimi in circolazione offrono una complessita temporale O(n logn) nel caso peggiore...non ho analizzato la complessità del tuo algoritmo, ma non credo sia tanto efficiente, per via di tutti i confronti introdotti da alcuni metodi.
Devi accedere o registrarti per scrivere nel forum
3 risposte