Algoritmi di ordinamento
( °_° )
Download file .java:
https://mega.nz/#!3V9ESDpR!D3en1QDuSh_CNBOh5-8pYzp23DthnlKl-Tz3yKjjBoQ
Insertion Sort
public static int[] InsertionSort(int vet[]){
int i, j;
int value;
for(i=0;i<vet.length;i++){
value = vet[i];
j = i-1;
while(j>=0&&vet[j]>value){
vet[j+1] = vet[j];
j = j-1;
}
vet[j+1] = value;
}
return vet;
}
Spiegazione:
Vettore iniziale: 2 - 5 - 8 - 11 - 14 - 9
- 2 - 5 - 8 - 11 - 9 - 14
- 2 - 5 - 8 - 9 - 11 - 14
Nell'esempio sopra riportato ciò che fa l'algoritmo lo vediamo con l'ultimo elemento del vettore: viene eseguito un controllo con l'elemento precedente fino ad arrivare alla giusta posizione. Nel caso peggiore si rivela un pessimo algoritmo, questo dovuto anche perché fino a quando non termina il ciclo for non posso avere la certezza della posizione di un elemento, poiché a ogni iterazione del while è molto probabile che essa vari. Nel caso migliore, invece, risulta ottimale.
Selection Sort
public static int[] SelectionSort(int vet[]){
int i, j;
int posmin;
int tmp;
for(i=0;i<vet.length;i++){
posmin = i;
for(j=(i+1);j<vet.length;j++){
if(vet[j]<vet[posmin]){
posmin = j;
}
}
tmp = vet[i];
vet[i] = vet[posmin];
vet[posmin] = tmp;
}
return vet;
}
Spiegazione:
Vettore iniziale: 2 - 1 - 7 - 9 - 0
- 0 - 1 - 7 - 9 - 2
- 0 - 1 - 7 - 9 - 2
- 0 - 1 - 2 - 9 - 7
- 0 - 1 - 2 - 7 - 9
In rosso sono segnati i valori che vengono scambiati; il selection non fa altro che individuare l'elemento maggiore e scambiarlo con quello di indice i. A ogni passo l'elemento più a sinistra è già ordinato. Rispetto ai suoi concorrenti, è tutt'altro che un buon algoritmo di ordinamento: sia il caso pessimo che il caso ottimo hanno tempi di esecuzione elevati.
Bubble Sort
public static int[] BubbleSort(int vet[]){
int i, j, k=vet.length-1;int tmp;
for(i=0;i<vet.length;i++){
for(j=0;j<k;j++){
if(vet[j]>vet[j+1]){
tmp = vet[j];
vet[j] = vet[j+1];
vet[j+1] = tmp;
}
}
k--;
}
return vet;
}
- 2 - 5 - 4 - 0 - 8 - 1
- 2 - 4 - 5 - 0 - 8 - 1
- 2 - 4 - 0 - 5 - 8 - 1
- 2 - 4 - 0 - 5 - 8 - 1
- 2 - 4 - 0 - 5 - 1 - 8 [ ... ]
Spiegazione:
Vettore iniziale: 5 - 2 - 4 - 0 - 8 - 1
Il bubble è chiamato così perché ordina ciascuna coppia di elementi adiacenti. E' un algoritmo di facile comprensione, a discapito della velocità nel caso pessimo. Il codice a sinistra non è quello base, è stato ottimizzato: visto che a ogni iterazione del for più interno l'elemento più a destra è già ordinato, nelle successive iterazioni posso anche non tenere conto di tali elementi. Ovviamente l'esempio riportato sopra è parziale: diventa completo quando il for più esterno termina.
Quick Sort & Merge Sort
- Ricorsivi -
public static int[] QuickSort(int vet[]){
int sx, dx;
sx = 0;
dx = vet.length - 1;
procedura_quicksort(vet,sx,dx);
return vet;
}
public static void procedura_quicksort(int vet[], int sx, int dx){
int i, j;
int pivot;
int tmp;
pivot = vet[(sx + dx) / 2];
i=sx;
j=dx;
while(i<=j){
while(vet[i] < pivot){
i++;
}
while(vet[j] > pivot){
j--;
}
if(i<=j) {
if(i<j) {
tmp = vet[i];
vet[i] = vet[j];
vet[j] = tmp;
}
i++;
j--;
}
}
if(sx<j) procedura_quicksort(vet,sx,j);
if(i<dx) procedura_quicksort(vet,i,dx);
}
public static int[] MergeSort(int vet[]){
procedura_mergesort(vet);
return vet;
}
public static void procedura_mergesort(int[] vet, int[] VetTmp, int sx, int dx){
if (sx < dx) {
int centro = (sx + dx) /2;
procedura_mergesort (vet, VetTmp, sx, centro);
procedura_mergesort (vet, VetTmp, centro+1, dx);
procedura_merge (vet, VetTmp, sx, centro+1, dx);
}
}
public static void procedura_mergesort(int[] vet){
int VetTmp [];
VetTmp = new int [vet.length];
procedura_mergesort (vet, VetTmp, 0, vet.length-1);
}
public static void procedura_merge(int[] vet, int[] VetAux, int pos_sx, int pos_dx, int PosFine){
int fine_sx = pos_dx - 1;
int posAux = pos_sx;
int x = PosFine - pos_sx + 1;
while (pos_sx <= fine_sx && pos_dx <= PosFine){
if ((vet[ pos_sx ])< (vet[pos_dx]))
VetAux [posAux++] = vet[pos_sx++];
else
VetAux [posAux++] = vet[pos_dx++];
}
while(pos_sx <= fine_sx){
VetAux [posAux++]=vet[pos_sx++];
}
while(pos_dx <= PosFine){
VetAux [posAux++]=vet[pos_dx++];
}
for(int i=0; i<x; i++, PosFine--){
vet[PosFine]=VetAux[PosFine];
}
}
