Ho scritto questa funzione per l' insertion sort:
Ho provato a calcolare il costo computazionale.codice:void InsertionSort(int *v, int n) { int i,j; for(i=0;i<n;i++) { j=i+1; while(j>0 && v[j]<v[j-1]) { swap(&v[j-1],&v[j]); j--; } } }
Che comunque deve essere O(n) nel caso che sia già ordinato, e O(n^2) nel caso sia ordinato in ordine decrescente.
Ho concluso allora che,se n è la dimensione dell' array, il costo è uguale alla sommatoria da 0 a n-1 del costo del while interno.
Nel caso migliore il while interno non parte ma viene efettuato un solo confronto, e qui ci siamo.
Ma nel caso peggiore il while viene eseguito i+1 volte, quindi il costo nel caso peggiore dovrebbe essere la sommatoria che va da 0 a n-1 di i+1, cioè (n^2+n)/2.
Eppure se provo a inserire una variabile globale, che la chiamo contatore, che conta tutte le volte che viene effettuato un confronto (quindi anche se il while non parte viene incrementata di 1), ho un risultato strano.
Mi risulta che il costo è uguale a (n^2+n)/2 se l' array ha dimensione pari , e un costo uguale a (n^2-n)/2 se l' array ha dimensione dispari, ma non riesco a capire perchè
Dovrebbe avere un costo indipendente dal fatto che la dimensione dell' array sia pari o dispari ...