Il problema dell’ordinamento consiste nell’ordinare in senso crescente o decrescente tutti gli elementi di un dato array ordinato.

Vi sono vari tipi di algoritmi di ordinamento (sorting algorithm), l’efficienza di ciascuno di essi è data teoricamente contando il numero di confronti effettuati.

Tra gli algoritmi più semplici vedremo il BubbleSort, il SelectionSort e l’InsertionSort. Sono tutti e tre di ordine , cioè è necessario (approssimativamente) eseguire n² controlli per ordinare un array di n elementi.

Innanzitutto faremo uso della funzione swap, che scambia tra loro due valori di un dato array:

public static void swap(int array[], int primo, int secondo)
 {
	int tmp;
	tmp=array[primo];
	array[primo]=array[secondo];
	array[secondo]=tmp;
}

Il BubbleSort passa in rassegna tutti i valori dell’array diverse volte.
Durante ogni scansione vengono confrontate tutte le coppie di elementi contigui: se, in una coppia, il primo valore è minore o uguale al secondo, gli elementi vengono lasciati al loro posto; se, invece, il primo valore è maggiore del secondo i due elementi vengono scambiati di posto nell’array, tramite la funzione swap.
Tutto ciò si ripete finchè l’array non è ordinato:

public static void BubbleSort(int array[])
{
	for (int x=1; x<array.length; x++)
		for (int i=0; i<array.length-x; i++)
			if (array[i]>array[i+1])
				swap(array, i, i+1);
}

Il SelectionSort ricerca il più piccolo valore dell’array e lo scambia con l’elemento nella prima posizione dell’array. Dopo di che ricerca l’ennesimo valore più piccolo nell’array e scambia tale elemento con quello nell’ennesima posizione dell’array e ripete questo procedimento finché l’intero array è ordinato.

public static void SelectionSort(int array[])
{
	int min;

	for (int index=0; index<array.length-1; index++)
	{
		min=index;
		for (int i=index+1; i<array.length; i++)
			if (array[i]<array[min])
				min=i;
		swap(array, index, min);
	}
}

L’InsertionSort sposta ogni elemento in un sotto-array ordinato, considerando un elemnto alla volta lo inserisce nella posizione corretta tra quelli già considerati e fa scorrere di posizione tutto il resto:

public static void InsertionSort(int array[])
{
	for (int index=1; index<array.length; index++)
	{
		int key=array[index];
		int position=index;

		while (position>0 && key<array[position-1])
		{
			array[position]=array[position-1];
			position--;
		}

		array[position]=key;
	}
}

About OpenProgrammers

Programmatore per passione. Mi piace condividere qualsiasi idea o informazione utile, per questo motivo ho realizzato il blog.