Сортировка массива структур без использования Qsort - C (СИ)
Формулировка задачи:
Здравствуйте! Для сортировки массива структур я использовал стандартную функцию qsort(), но как оказалось так делать по заданию нельзя! Можете помочь написать код сортировки массива структур по возрастанию? Спасибо
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> #define n 15 static const char* filename = "statistic.dat"; struct information { char user[32]; int array[n]; int iterations; }; // функция сортировки void sort(int* array, int* it) { int i, j; for(i = n - 1; i >= 1; i--) { for(j = 0; j < i; j++) { if(array[j] > array[j+1]) { int foo = array[j]; array[j] = array[j+1]; array[j+1] = foo; // инкрементируем счетчик (*it)++; } } } } // фнкция сравнения для qsort() int compar(const void* a, const void* b) { struct information* _1 = (struct information*)a; struct information* _2 = (struct information*)b; return _1->iterations < _2->iterations; } int main() { int i; struct information info; info.iterations = 0; // инициализируем члены структуры нужными значениями printf("Введите имя\n"); scanf("%s", info.user); printf("Bedute 15 elemeHtoB macuBa\n"); for(i = 0; i < n; i++) { printf("mass[%d] = ", i); scanf("%d", &info.array[i]); } printf("\n"); // функция сортировки sort(info.array, &info.iterations); for(i = 0; i < n; i++) { printf("%4d ", info.array[i]); } printf("\n"); // открываем файл для чтения предыдущей статистики FILE* file = fopen(filename, "rb"); // если такого файла не существует, значит статистики нет if ( !file ) { // создаем file = fopen(filename, "wb"); // если создать не удалось, значит ошибка if ( !file ) { // сообщаем fprintf(stderr, "can`t create file!"); // возвращаем ошибку return 1; } // если файл создался - записываем в него первую структуру // записываем fwrite(&info, sizeof(struct information), 1, file); // закрываем файл fclose(file); // выходим return 0; } else { // предыдущая статистика существует // определяем размер файла чтоб узнать сколько структур в него записано // это нам нужно чтоб знать сколько памяти выделять struct stat fileinfo; fstat(fileno(file), &fileinfo); // размер файла int file_size = fileinfo.st_size; // кол-во структур в файле int structs = file_size/sizeof(struct information); // выделяем память struct information* structs_arr = (struct information*)malloc(sizeof(struct information)*(structs+1)); // считываем из файла предыдущие структуры for ( i = 0; i < structs; ++i ) { fread(&structs_arr[i], sizeof(struct information), 1, file); } // закрываем файл fclose(file); // добавляем нашу структуру memcpy(&structs_arr[structs], &info, sizeof(struct information)); // сортируем qsort(structs_arr, structs+1, sizeof(struct information), compar); // открываем файл для записи file = fopen(filename, "wb"); // если не удалось - if ( !file ) { // освобождаем память free(structs_arr); // сообщаем printf("can`t open file for writing"); // выходим return 1; } // записываем for ( i = 0; i < structs+1; ++i ) { fwrite(&structs_arr[i], sizeof(struct information), 1, file); } // освобождаем память free(structs_arr); // закрываем файл fclose(file); } return 0; }
Решение задачи: «Сортировка массива структур без использования Qsort»
textual
Листинг программы
#include <stdio.h> struct some { int a, b, c; }; int main(void) { struct some arr[3] = { { 3, 2, 1 }, { 4, 1, 2 }, { 1, 0, 0 } }; int i, j; for (i = 0; i < 3 - 1; i++) for (j = i + 1; j < 3; j++) if (arr[i].b > arr[j].b) { struct some t; t = arr[i], arr[i] = arr[j], arr[j] = t; } for (i = 0; i < 3; i++) printf( "a = %d, b = %d, c = %d" "\n", arr[i].a, arr[i].b, arr[i].c ); return 0; }
Объяснение кода листинга программы
В данном коде происходит сортировка массива структур some по значению поля b.
- Структура some содержит три поля: a, b, c.
- Массив arr[3] инициализируется значениями {3, 2, 1}, {4, 1, 2}, {1, 0, 0}.
- Используется алгоритм сортировки пузырьком:
- Внешний цикл: i = 0..2 (длина массива - 1)
- Внутренний цикл: j = i + 1..2 (длина массива)
- Если b[i] > b[j], то элементы меняются местами с помощью временной переменной t.
- Выводится отсортированный массив:
- Внутренний цикл: i = 0..2
- Выводится значение полей a, b, c для каждого элемента массива.
- Программа возвращает 0, заканчивая свою работу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д