Реализация быстрой сортировки - 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;

Объяснение кода листинга программы

  1. e = arr[i]; Переменная e получает значение элемента массива arr с индексом i.
  2. arr[i++] = arr[j]; Элемент массива arr с индексом j заменяется на значение элемента массива arr с индексом i, и i увеличивается на 1.
  3. arr[j--] = e; Элемент массива arr с индексом j заменяется на значение переменной e, и j уменьшается на 1.
  4. d = stud[i]; Переменная d получает значение элемента массива stud с индексом i.
  5. stud[i++] = stud[j]; Элемент массива stud с индексом j заменяется на значение элемента массива stud с индексом i, и i увеличивается на 1.
  6. stud[j--] = d; Элемент массива stud с индексом j заменяется на значение переменной d, и j уменьшается на 1.

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


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

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

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