Сортировка Хоара в массиве структур - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Не могу нормально отсортировать элементы структуры с помощью быстрой сортировки. Программа просто, не прекращается, как будто цикл бесконечный. Не могу понять где ошибка. HELP!
#include <locale.h.>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <locale.h>
#include <string.h>
struct Product {
    char name[15];
};
int N;
struct Product A[100];
struct Product X[1];
int Check_Input()
{
    char buf[BUFSIZ];
    char junk;
    int Input;
    bool ok = false;
    while (!ok)
    {
        _textcolor(7);
        fputs("Введите количество товара: ", stdout);
        fflush(stdout);
        if (fgets(buf, BUFSIZ, stdin) == NULL)
        {
            if (!ferror(stdin))
            {
                fputs("Вход не доступен!\n", stderr);
                exit(EXIT_FAILURE);
            }
            else
            {
                perror("stdin");
                clearerr(stdin);
                continue;
            }
        }
        if (sscanf(buf, "%d %c\n", &Input, &junk) != 1)
        {
            _textcolor(4);
            fputs("Неправильный ввод!\n", stderr);
            continue;
        }
        if (Input <= 0 || Input > 99)
        {
            _textcolor(4);
            fputs("Неправильный ввод!\n", stderr);
            continue;
        }
        ok = true;
    }
    return Input;
}
void speed2_inc_dec1_flat1(int l, int r)
{
    int k=(r + l) / 2;  //находят  центральный элемент
    printf("%d\n",k);
    A[N+1]=A[k];
    printf("%s\n",X[1].name);
    int i = l;
    int j = r;
    while (i <= j)
    {
        while //(A[i].name[0] > X[1].name[0])
            (strcmp(A[i].name,A[N+1].name)<0)
            i++;
        while //(A[i].name[0] < X[1].name[0])
            (strcmp(A[i].name,A[N+1].name)>0)
            j++;
        if (i <= j)
        {
            A[N] = A[j];
            A[j] = A[i];    //<----Обмен переменными
            A[i] = A[N];
            i++;
            j--;
        }
    }
    if (i < r)
        speed2_inc_dec1_flat1(i, r);
    if (l < j)
        speed2_inc_dec1_flat1(l, j);
}
void Output(struct Product *array, int size)
{
    for(int i = 0; i < size; i++)
    {
        printf("%s\n", array[i].name);
    }
}
void Input(struct Product *array, int size)
{
    for(int i = 0; i < size; i++)
    {
        printf("Введите элемент №%d: ", i+1);
        scanf("%s", &array[i].name);
    }
}
int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "ru");
    system("cls");
    N=Check_Input();
    Input(A,N);
    Output(A,N);
    speed2_inc_dec1_flat1(0,N-1);
    Output(A,N);
}

Решение задачи: «Сортировка Хоара в массиве структур»

textual
Листинг программы
void quickSort_inc(struct Product *a, int l, int r)
{
    int x = l + (r - l) / 2;
    int i = l;
    int j = r;
    while (i <= j)
    {
 
        while (strcmp(a[i].name, a[x].name) < 0)
            i++;
        while (strcmp(a[j].name, a[x].name) > 0)
            j--;
        if (i <= j)
        {
            a[N]=a[j];
            a[j]=a[i];
            a[i]=a[N];
            i++;
            j--;
        }
    }
    if (i < r)
        quickSort_inc(a, i, r);
 
    if (l < j)
        quickSort_inc(a, l, j);
}

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

  1. В функции quickSort_inc сортируется массив структур Product по полю name в порядке возрастания.
  2. Вектор a содержит элементы, которые необходимо отсортировать.
  3. int x = l + (r — l) / 2; используется для выбора опорного элемента из массива a.
  4. int i = l; используется для итерации по элементам массива a слева от опорного элемента.
  5. int j = r; используется для итерации по элементам массива a справа от опорного элемента.
  6. В цикле while (i <= j) происходит разделение массива a на две части относительно опорного элемента.
  7. Внутренний цикл while (strcmp(a[i].name, a[x].name) < 0) используется для поиска элементов, которые нужно поменять местами с элементом a[x].
  8. Внутренний цикл while (strcmp(a[j].name, a[x].name) > 0) используется для поиска элементов, которые нужно поменять местами с элементом a[x].
  9. Если найдены элементы, которые нужно поменять местами, то они меняются местами с помощью a[N]=a[j]; a[j]=a[i]; a[i]=a[N];
  10. После выполнения внутреннего цикла, i и j инкрементируются и декрементируются соответственно, чтобы продолжить процесс разделения массива.
  11. Если i < r, то рекурсивно вызывается функция quickSort_inc для сортировки элементов, находящихся слева от опорного элемента.
  12. Если l < j, то рекурсивно вызывается функция quickSort_inc для сортировки элементов, находящихся справа от опорного элемента.
  13. Код не содержит обработки ошибок.
  14. Код не содержит выведения на экран или сохранения отсортированного массива.
  15. Временная сложность алгоритма quickSort_inc составляет O(n log n).
  16. Пространственная сложность алгоритма quickSort_inc составляет O(log n), так как рекурсия не создает дополнительных переменных.
  17. Для работы алгоритма требуется дополнительная память, равная O(n), для хранения временных копий элементов массива a.
  18. Для успешной работы алгоритма необходимо, чтобы массив a был отсортирован по полю name в порядке возрастания.
  19. Если массив a содержит дубликаты по полю name, то они будут отсортированы в порядке возрастания.
  20. В исходном коде отсутствует реализация функции quickSort_inc, поэтому невозможно проверить его работоспособность.

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


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

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

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