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

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

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

Не могу нормально отсортировать элементы структуры с помощью быстрой сортировки. Программа просто, не прекращается, как будто цикл бесконечный. Не могу понять где ошибка. HELP!
Листинг программы
  1. #include <locale.h.>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <stdbool.h>
  5. #include <locale.h>
  6. #include <string.h>
  7. struct Product {
  8. char name[15];
  9. };
  10. int N;
  11. struct Product A[100];
  12. struct Product X[1];
  13. int Check_Input()
  14. {
  15. char buf[BUFSIZ];
  16. char junk;
  17. int Input;
  18. bool ok = false;
  19. while (!ok)
  20. {
  21. _textcolor(7);
  22. fputs("Введите количество товара: ", stdout);
  23. fflush(stdout);
  24. if (fgets(buf, BUFSIZ, stdin) == NULL)
  25. {
  26. if (!ferror(stdin))
  27. {
  28. fputs("Вход не доступен!\n", stderr);
  29. exit(EXIT_FAILURE);
  30. }
  31. else
  32. {
  33. perror("stdin");
  34. clearerr(stdin);
  35. continue;
  36. }
  37. }
  38. if (sscanf(buf, "%d %c\n", &Input, &junk) != 1)
  39. {
  40. _textcolor(4);
  41. fputs("Неправильный ввод!\n", stderr);
  42. continue;
  43. }
  44. if (Input <= 0 || Input > 99)
  45. {
  46. _textcolor(4);
  47. fputs("Неправильный ввод!\n", stderr);
  48. continue;
  49. }
  50. ok = true;
  51. }
  52. return Input;
  53. }
  54. void speed2_inc_dec1_flat1(int l, int r)
  55. {
  56. int k=(r + l) / 2; //находят центральный элемент
  57. printf("%d\n",k);
  58. A[N+1]=A[k];
  59. printf("%s\n",X[1].name);
  60. int i = l;
  61. int j = r;
  62. while (i <= j)
  63. {
  64. while //(A[i].name[0] > X[1].name[0])
  65. (strcmp(A[i].name,A[N+1].name)<0)
  66. i++;
  67. while //(A[i].name[0] < X[1].name[0])
  68. (strcmp(A[i].name,A[N+1].name)>0)
  69. j++;
  70. if (i <= j)
  71. {
  72. A[N] = A[j];
  73. A[j] = A[i]; //<----Обмен переменными
  74. A[i] = A[N];
  75. i++;
  76. j--;
  77. }
  78. }
  79. if (i < r)
  80. speed2_inc_dec1_flat1(i, r);
  81. if (l < j)
  82. speed2_inc_dec1_flat1(l, j);
  83. }
  84. void Output(struct Product *array, int size)
  85. {
  86. for(int i = 0; i < size; i++)
  87. {
  88. printf("%s\n", array[i].name);
  89. }
  90. }
  91. void Input(struct Product *array, int size)
  92. {
  93. for(int i = 0; i < size; i++)
  94. {
  95. printf("Введите элемент №%d: ", i+1);
  96. scanf("%s", &array[i].name);
  97. }
  98. }
  99. int main(int argc, char *argv[])
  100. {
  101. setlocale(LC_ALL, "ru");
  102. system("cls");
  103. N=Check_Input();
  104. Input(A,N);
  105. Output(A,N);
  106. speed2_inc_dec1_flat1(0,N-1);
  107. Output(A,N);
  108. }

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

textual
Листинг программы
  1. void quickSort_inc(struct Product *a, int l, int r)
  2. {
  3.     int x = l + (r - l) / 2;
  4.     int i = l;
  5.     int j = r;
  6.     while (i <= j)
  7.     {
  8.  
  9.         while (strcmp(a[i].name, a[x].name) < 0)
  10.             i++;
  11.         while (strcmp(a[j].name, a[x].name) > 0)
  12.             j--;
  13.         if (i <= j)
  14.         {
  15.             a[N]=a[j];
  16.             a[j]=a[i];
  17.             a[i]=a[N];
  18.             i++;
  19.             j--;
  20.         }
  21.     }
  22.     if (i < r)
  23.         quickSort_inc(a, i, r);
  24.  
  25.     if (l < j)
  26.         quickSort_inc(a, l, j);
  27. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы