191 lines
4.2 KiB
C
191 lines
4.2 KiB
C
// Laboratorio 7 - Esercizio 2
|
|
// Matteo Schiff - s295565
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#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;
|
|
} |