Сортировка массива структур без использования 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.

  1. Структура some содержит три поля: a, b, c.
  2. Массив arr[3] инициализируется значениями {3, 2, 1}, {4, 1, 2}, {1, 0, 0}.
  3. Используется алгоритм сортировки пузырьком:
    • Внешний цикл: i = 0..2 (длина массива - 1)
    • Внутренний цикл: j = i + 1..2 (длина массива)
    • Если b[i] > b[j], то элементы меняются местами с помощью временной переменной t.
  4. Выводится отсортированный массив:
    • Внутренний цикл: i = 0..2
    • Выводится значение полей a, b, c для каждого элемента массива.
  5. Программа возвращает 0, заканчивая свою работу.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы