From ab08c8342dd021b5e618e2e4bebde1ff48315f87 Mon Sep 17 00:00:00 2001 From: Vichingo455 Date: Thu, 15 May 2025 14:45:56 +0000 Subject: [PATCH] Upload files to "file" --- file/fsorts.cpp | 135 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 file/fsorts.cpp diff --git a/file/fsorts.cpp b/file/fsorts.cpp new file mode 100644 index 0000000..9dbc536 --- /dev/null +++ b/file/fsorts.cpp @@ -0,0 +1,135 @@ +/* +AUTORE: Manuel Vichi 3^AIN +Algoritmi sort su file +*/ +#include +#include +#include +void fSelectionSort(const char *nomeFile) { + FILE *fp = fopen(nomeFile, "r+b"); + if (fp == NULL) { + perror("Errore nell'apertura del file"); + return; + } + fseek(fp, 0, SEEK_END); + long dimensioneFile = ftell(fp); + fseek(fp, 0, SEEK_SET); + size_t n = dimensioneFile / sizeof(int); + int valoreMin, valoreCorrente; + size_t indiceMin; + int temp; + for (size_t i = 0; i < n - 1; i++) { + indiceMin = i; + fseek(fp, i * sizeof(int), SEEK_SET); + fread(&valoreMin, sizeof(int), 1, fp); + for (size_t j = i + 1; j < n; j++) { + fseek(fp, j * sizeof(int), SEEK_SET); + fread(&valoreCorrente, sizeof(int), 1, fp); + if (valoreCorrente < valoreMin) { + valoreMin = valoreCorrente; + indiceMin = j; + } + } + if (indiceMin != i) { + fseek(fp, i * sizeof(int), SEEK_SET); + fread(&temp, sizeof(int), 1, fp); + int valoreTemp; + fseek(fp, indiceMin * sizeof(int), SEEK_SET); + fread(&valoreTemp, sizeof(int), 1, fp); + fseek(fp, i * sizeof(int), SEEK_SET); + fwrite(&valoreTemp, sizeof(int), 1, fp); + fseek(fp, indiceMin * sizeof(int), SEEK_SET); + fwrite(&temp, sizeof(int), 1, fp); + } + } + fclose(fp); +} +void fBubbleSort(const char *nomeFile) { + FILE *fp = fopen(nomeFile, "r+b"); + if (fp == NULL) { + perror("Errore nell'apertura del file"); + return; + } + fseek(fp, 0, SEEK_END); + long dimensioneFile = ftell(fp); + fseek(fp, 0, SEEK_SET); + size_t n = dimensioneFile / sizeof(int); + int valore1, valore2; + bool scambiato; + for (size_t i = 0; i < n - 1; i++) { + scambiato = false; + for (size_t j = 0; j < n - i - 1; j++) { + fseek(fp, j * sizeof(int), SEEK_SET); + if (fread(&valore1, sizeof(int), 1, fp) != 1) { + perror("Errore di lettura del file"); + fclose(fp); + return; + } + fseek(fp, (j + 1) * sizeof(int), SEEK_SET); + if (fread(&valore2, sizeof(int), 1, fp) != 1) { + perror("Errore di lettura del file"); + fclose(fp); + return; + } + if (valore1 > valore2) { + fseek(fp, j * sizeof(int), SEEK_SET); + if (fwrite(&valore2, sizeof(int), 1, fp) != 1) { + perror("Errore di scrittura nel file"); + fclose(fp); + return; + } + fseek(fp, (j + 1) * sizeof(int), SEEK_SET); + if (fwrite(&valore1, sizeof(int), 1, fp) != 1) { + perror("Errore di scrittura nel file"); + fclose(fp); + return; + } + scambiato = true; + } + } + if (!scambiato) { + break; + } + } + fclose(fp); +} +void swap(FILE *fp, int pos1, int pos2, size_t elementSize) { + int temp1, temp2; + fseek(fp, pos1 * elementSize, SEEK_SET); + fread(&temp1, elementSize, 1, fp); + fseek(fp, pos2 * elementSize, SEEK_SET); + fread(&temp2, elementSize, 1, fp); + fseek(fp, pos1 * elementSize, SEEK_SET); + fwrite(&temp2, elementSize, 1, fp); + fseek(fp, pos2 * elementSize, SEEK_SET); + fwrite(&temp1, elementSize, 1, fp); +} +int partition(FILE *fp, int low, int high, size_t elementSize) { + int pivot; + fseek(fp, high * elementSize, SEEK_SET); + fread(&pivot, elementSize, 1, fp); + int i = low - 1; + for (int j = low; j < high; j++) { + int current; + fseek(fp, j * elementSize, SEEK_SET); + fread(¤t, elementSize, 1, fp); + if (current < pivot) { + i++; + swap(fp, i, j, elementSize); + } + } + swap(fp, i + 1, high, elementSize); + return i + 1; +} +void fQuickSort(FILE *fp, int low, int high, size_t elementSize) { + if (low < high) { + int pi = partition(fp, low, high, elementSize); + fQuickSort(fp, low, pi - 1, elementSize); + fQuickSort(fp, pi + 1, high, elementSize); + } +} +int main(void) { + //fSelectionSort("file_prova.bin"); + fBubbleSort("giovanni.bin"); + return 0; +} \ No newline at end of file