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