// Laboratorio 7 - Esercizio 2 // Matteo Schiff - s295565 #include #include #define MAX_LEN 100 #define FILENAME "sort.txt" void leggiSequenza(int vec[MAX_LEN], int *len, FILE *fp_read); void copy(int source[MAX_LEN], int destination[MAX_LEN], int N); void insertionSort(int vec[MAX_LEN], int N); void selectionSort(int vec[MAX_LEN], int N); void shellSort(int vec[MAX_LEN], int N); void leggiSequenza(int vec[MAX_LEN], int *len, FILE *fp_read) { fscanf(fp_read, "%d ", len); // Leggi vettore for (int i = 0; i < *len; i++) { fscanf(fp_read, "%d ", &vec[i]); } } void copy(int source[MAX_LEN], int destination[MAX_LEN], int N) { for (int i = 0; i < N; i++) { destination[i] = source[i]; } } void insertionSort(int vec[MAX_LEN], int N) { // variabili per statistiche int scambi = 0, iterInt = 0, iterExt = 0, iterTot = 0; // variabili algoritmo int i, j, l = 0, r = N - 1, x; printf(" -- Insertion sort\n"); for (i = l + 1; i <= r; i++) { iterInt = 0; x = vec[i]; j = i - 1; while (j >= 0 && x < vec[j]) { vec[j + 1] = vec[j]; j--; // incremento statistiche scambi++; iterInt++; } vec[j + 1] = x; // aggiorno statistiche scambi++; iterTot += iterInt; iterExt++; printf(" Iterazioni al ciclo %d: %d\n", i, iterInt); } iterTot += iterExt; printf(" Iterazioni esterne: %d\n", iterExt); printf(" Iterazioni totali: %d\n", iterTot); printf(" Scambi: %d\n", scambi); } void selectionSort(int vec[MAX_LEN], int N) { // variabili per statistiche int scambi = 0, iterInt = 0, iterExt = 0, iterTot = 0; // variabili algoritmo int i, j, l = 0, r = N - 1, min, temp; printf(" -- Selection sort\n"); for (i = l; i <= r; i++) { iterInt = 0; min = i; for (j = i + 1; j <= r; j++) { if (vec[j] < vec[min]) min = j; iterInt++; } if (min != i) { temp = vec[i]; vec[i] = vec[min]; vec[min] = temp; scambi++; } // aggiorno statistiche iterTot += iterInt; iterExt++; printf(" Iterazioni al ciclo %d: %d\n", i, iterInt); } iterTot += iterExt; printf(" Iterazioni esterne: %d\n", iterExt); printf(" Iterazioni totali: %d\n", iterTot); printf(" Scambi: %d\n", scambi); } void shellSort(int vec[MAX_LEN], int N) { // variabili per statistiche int scambi = 0, iterInt = 0, iterExt = 0, iterTot = 0; // variabili algoritmo int i, j, x, l = 0, r = N - 1, h = 1; printf(" -- Shell sort\n"); while (h < N / 3) h = 3 * h + 1; while (h >= 1) { for (i = l + h; i <= r; i++) { iterInt = 0; j = i; x = vec[i]; while (j >= l + h && x < vec[j - h]) { vec[j] = vec[j - h]; j -= h; scambi++; iterInt++; } vec[j] = x; scambi++; // aggiorno statistiche iterTot += iterInt; iterExt++; printf(" Iterazioni al ciclo %d: %d\n", i, iterInt); } h = h / 3; } iterTot += iterExt; printf(" Iterazioni esterne: %d\n", iterExt); printf(" Iterazioni totali: %d\n", iterTot); printf(" Scambi: %d\n", scambi); } int main() { FILE *fp_read; int vec[MAX_LEN], toOrder[MAX_LEN]; int n, len; if ((fp_read = fopen(FILENAME, "r")) == NULL) { puts("Impossibile aprire il file\n"); return 1; } fscanf(fp_read, "%d ", &n); for (int i = 0; i < n; i++) { leggiSequenza(vec, &len, fp_read); printf(" - Sequenza %d\n", i); copy(vec, toOrder, len); insertionSort(toOrder, len); copy(vec, toOrder, len); selectionSort(toOrder, len); copy(vec, toOrder, len); shellSort(toOrder, len); putc('\n', stdout); } fclose(fp_read); return 0; }