Сортировка qsort - Stack overflow, нарушение прав доступа при записи по адресу - C (СИ)

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

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

Найдите, пожалуйста, ошибку в коде. Программа завершается с ошиибкой Stack overflow, и нарушение прав доступа при записи по адрессу.
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void qsrt(int a[], int low, int hig)
  4. {
  5. int i=low,j=hig,p=((low+hig)/2);
  6. int tmp;
  7. while(i<j)
  8. {
  9. while(a[i]<=a[p]) i++;
  10. while(a[j]>=a[p]) j--;
  11. if(i<=j)
  12. {
  13. tmp=a[i];
  14. a[i]=a[j];
  15. a[j]=tmp;
  16. i++; j--;
  17. }
  18. }
  19. if(low<j) qsrt(a,low,j);
  20. if(hig>i) qsrt(a,i,hig);
  21. }
  22. int main()
  23. {
  24. int t[100];
  25. int i;
  26. srand(time(NULL));
  27. for (i=0;i<100;i++) t[i]=rand()%300;
  28. qsrt(t,0,99);
  29. for (i=0; i<100;i++) printf("%d\n",t[i]);
  30. getchar();
  31. return 0;
  32. }

Решение задачи: «Сортировка qsort - Stack overflow, нарушение прав доступа при записи по адресу»

textual
Листинг программы
  1. void qsrt(int a[], int low, int hig)
  2. {
  3.     int i=low,j=hig,p=a[(low+hig)/2];
  4.     int tmp;
  5.     while(i<j)
  6.     {
  7.         while(a[i]<p) i++;
  8.         while(a[j]>p) j--;
  9.  
  10.         if(i<=j)
  11.         {
  12.             tmp=a[i];
  13.             a[i]=a[j];
  14.             a[j]=tmp;
  15.             i++; j--;
  16.         }
  17.     }
  18.     if(low<j) qsrt(a,low,j);
  19.     if(hig>i) qsrt(a,i,hig);
  20. }

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

В данном коде реализована сортировка массива методом Quick Sort.

  1. В первой строке определяется начальный индекс (low), конечный индекс (hig) и средний элемент массива (p).
  2. Затем, в цикле while(i<j), происходит сравнение элементов массива a[i] и p. Если a[i] меньше p, то i увеличивается на единицу, иначе, если a[i] больше p, то i уменьшается на единицу.
  3. В следующей итерации цикла, в while(a[i]<p), происходит смещение элемента p влево, путем увеличения индекса i до тех пор, пока не будет найден элемент, меньший p.
  4. Аналогично, в while(a[j]>p), происходит смещение элемента p вправо, путем уменьшения индекса j до тех пор, пока не будет найден элемент, больший p.
  5. Если в процессе выполнения циклов были произведены перемещения элементов, то значения i и j сдвигаются на единицу вперед и назад соответственно.
  6. Если i меньше или равно j, то происходит обмен элементов a[i] и a[j].
  7. Если i больше j, то выполнение функции завершается.
  8. Если в процессе выполнения функции были найдены элементы, меньшие или большие p, то рекурсивно вызывается функция qsrt для соответствующих диапазонов массива. Поскольку в коде отсутствует вызов функции qsrt, то предполагается, что данная функция вызывается для всего массива в начале кода. Примечание: Данный код может вызвать переполнение стека при больших значениях low и hig, поскольку функция qsrt рекурсивно вызывается для все более узких диапазонов массива, пока не будет найден элемент, меньший или больший p.

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


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

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

6   голосов , оценка 3.833 из 5

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

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

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