Сортировка Хоара в массиве структур - 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); }
Объяснение кода листинга программы
- В функции quickSort_inc сортируется массив структур Product по полю name в порядке возрастания.
- Вектор a содержит элементы, которые необходимо отсортировать.
- int x = l + (r — l) / 2; используется для выбора опорного элемента из массива a.
- int i = l; используется для итерации по элементам массива a слева от опорного элемента.
- int j = r; используется для итерации по элементам массива a справа от опорного элемента.
- В цикле while (i <= j) происходит разделение массива a на две части относительно опорного элемента.
- Внутренний цикл while (strcmp(a[i].name, a[x].name) < 0) используется для поиска элементов, которые нужно поменять местами с элементом a[x].
- Внутренний цикл while (strcmp(a[j].name, a[x].name) > 0) используется для поиска элементов, которые нужно поменять местами с элементом a[x].
- Если найдены элементы, которые нужно поменять местами, то они меняются местами с помощью a[N]=a[j]; a[j]=a[i]; a[i]=a[N];
- После выполнения внутреннего цикла, i и j инкрементируются и декрементируются соответственно, чтобы продолжить процесс разделения массива.
- Если i < r, то рекурсивно вызывается функция quickSort_inc для сортировки элементов, находящихся слева от опорного элемента.
- Если l < j, то рекурсивно вызывается функция quickSort_inc для сортировки элементов, находящихся справа от опорного элемента.
- Код не содержит обработки ошибок.
- Код не содержит выведения на экран или сохранения отсортированного массива.
- Временная сложность алгоритма quickSort_inc составляет O(n log n).
- Пространственная сложность алгоритма quickSort_inc составляет O(log n), так как рекурсия не создает дополнительных переменных.
- Для работы алгоритма требуется дополнительная память, равная O(n), для хранения временных копий элементов массива a.
- Для успешной работы алгоритма необходимо, чтобы массив a был отсортирован по полю name в порядке возрастания.
- Если массив a содержит дубликаты по полю name, то они будут отсортированы в порядке возрастания.
- В исходном коде отсутствует реализация функции quickSort_inc, поэтому невозможно проверить его работоспособность.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д