Реализация быстрой сортировки - C (СИ) (250463)
Формулировка задачи:
Есть массив структур STUDENT, в который мы, кроме всего остального, вводим 5 оценок. Нужно отсортировать массив структур по среднему балу этих оценок. Я записываю средние баллы в массив arr.
В чем проблема: сортировка работает правильно с обычным массивом, но когда ты меняешь местами студентов, должен менять и их средний балл, а то сравниваешь значения, которые должны были бы быть отсортированы, а они не отсортированы. Я впихнул в сортировку сортирование среднего балла, но чет не заработало всё равно.Результат для наглядности в фотке)
#include#define N 5 struct STUDENT { char name[20]; int group; int mark[N]; }; void Hoar_sort(struct STUDENT stud[N], float *arr, int l,int r); int main(void) { struct STUDENT stud[N]; printf("Write:\n"); for (int i = 0; i < N; i++) { printf("%d.Name, group and 5 marks: ", i+1); scanf("%s%d", stud[i].name, &stud[i].group); for (int j = 0; j < N; j++) { scanf("%d", &stud[i].mark[j]); } } float arr[N]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { arr[i]+=stud[i].mark[j]; } arr[i]/=5; } Hoar_sort(stud, arr, 0, 4); printf("\nInfo:"); for(int i = 0; i < N; i++) { printf("\n%d.%s, %i, ", i+1, stud[i].name, stud[i].group); for(int j = 0; j < N; j++) { printf("%d ",stud[i].mark[j]); } } printf("\n Students with mark 4 and 5:"); for(int i = 0; i < N; i++) { for(int j = 0; j < N;j++) { if(stud[i].mark[j] == 4 || stud[i].mark[j] == 5) { printf("\n %s %i ", stud[i].name, stud[i].group); break; } } } return 0; } void Hoar_sort(struct STUDENT stud[N], float* arr, int l,int r) { int i=l, j=r; struct STUDENT d; float e; float m=arr[(l+r)/2]; while(i <= j) { for(; arr[i] < m; i++); for(; arr[j] > m; j--); if(i<=j) { e = arr[i]; arr[i++] = arr[j]; arr[j--] = e; d = stud[i]; stud[i++] = stud[j]; stud[j--] = d; } } if(l < j) Hoar_sort(stud, arr, l,j); if(i < r) Hoar_sort(stud, arr, i,r); }
Решение задачи: «Реализация быстрой сортировки»
textual
Листинг программы
e = arr[i]; arr[i++] = arr[j]; arr[j--] = e; d = stud[i]; stud[i++] = stud[j]; stud[j--] = d;
Объяснение кода листинга программы
- e = arr[i]; Переменная e получает значение элемента массива arr с индексом i.
- arr[i++] = arr[j]; Элемент массива arr с индексом j заменяется на значение элемента массива arr с индексом i, и i увеличивается на 1.
- arr[j--] = e; Элемент массива arr с индексом j заменяется на значение переменной e, и j уменьшается на 1.
- d = stud[i]; Переменная d получает значение элемента массива stud с индексом i.
- stud[i++] = stud[j]; Элемент массива stud с индексом j заменяется на значение элемента массива stud с индексом i, и i увеличивается на 1.
- stud[j--] = d; Элемент массива stud с индексом j заменяется на значение переменной d, и j уменьшается на 1.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д