Рекурсия выводит значение счетчика не один раз, а столько, сколько было рекурсивных вызовов - C (СИ)

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

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

Задача состоит в том, чтобы определить, какой метод сортировки быстрее. В одну функцию (SortBalb) я отправляю массив, и он сортируется пузырьком, в другую (QuickSort) отправляю такой же массив, где он сортируется методом быстрой сортировки(Хоара). Вывожу время сортировки и количество перестановок. Время выводит нормально, тк это просто. Вот количество итераций - для пузырька - просто, для QuickSort - получается, что срабатывает printf каждый вызов(что тоже естественно и понятно тк имеем рекурсию). Но не красиво. Как вывести суммарное количество перестановок для рекурсивной функции QuickSort?
Листинг программы
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include<conio.h>
  4. #include<stdlib.h>
  5. #include<string.h>
  6. #include<Windows.h>
  7. #include<time.h>
  8. void PrintArray(int*,int);
  9. void SortBalb(int*,int);
  10. void QuickSort(int*,int);
  11. void main()
  12. {
  13. int n,*arr,*arrForBalb,*arrForQuick;
  14. SetConsoleCP(1251);
  15. SetConsoleOutputCP(1251);
  16. srand(time(NULL));
  17. //puts("Введите размерность массива: ");
  18. //scanf("%d",&n);
  19. n=10000;
  20. arr=new int[n];
  21. arrForBalb=new int[n];
  22. arrForQuick=new int[n];
  23. for(int i=0;i<n;i++)
  24. {
  25. *(arr+i)=rand()%100;
  26. *(arrForBalb+i)=*(arr+i); //Сразу сохраню сгенеренный массив в массивы, над которыми будем издеваться
  27. *(arrForQuick+i)=*(arr+i);
  28. }
  29. //printf("Сгенерированный массив: \n");
  30. //PrintArray(arr,n);
  31. printf("\n");
  32. SortBalb(arrForQuick,n); //Издеваемся методом пузырька
  33. //printf("Отсортированный массив: \n");
  34. //PrintArray(arrForModify,n);
  35. printf("\n");
  36. clock_t timeQuickSort=clock();
  37. QuickSort(arrForQuick,n-1); //Издеваемся методом Хоара
  38. timeQuickSort=clock()-timeQuickSort;
  39. printf("\nВремя перестановок сортировкой Хоара: %lf секунд \n",(float)timeQuickSort/CLOCKS_PER_SEC);
  40.  
  41. _getch();
  42. }
  43. void PrintArray(int*a,int n)
  44. {
  45. for(int i=0;i<n;i++)
  46. printf("%d, ",*(a+i));
  47. }
  48. void SortBalb(int*a,int n)
  49. {
  50. int temp,countChange=0;
  51. clock_t timeBalb=clock();
  52. for(int i=0;i<n;i++)
  53. for(int j=0;j<n-1;j++)
  54. if(*(a+j)>*(a+j+1))
  55. {
  56. temp=*(a+j+1);
  57. *(a+j+1)=*(a+j);
  58. *(a+j)=temp;
  59. countChange++;
  60. }
  61. timeBalb=clock()-timeBalb;
  62. printf("\nВремя перестановок сортировкой обмена: %lf секунд \n",(float)timeBalb/CLOCKS_PER_SEC);
  63. //printf("\nКолличество перестановок: %d\n",countChange);
  64. }
  65. void QuickSort(int*a,int n)
  66. {
  67. int countChangeQuick=0,countChangeQuickTemp=0;
  68. int sizeForChange=n,left=0,temp;
  69. int pivot=*(a+(int)(n/2));
  70. do
  71. {
  72. while(*(a+left)<pivot)
  73. left++;
  74. while(*(a+n)>pivot)
  75. n--;
  76. if(left<=n)
  77. {
  78. temp=*(a+left);
  79. *(a+left)=*(a+n);
  80. *(a+n)=temp;
  81. left++;
  82. n--;
  83. countChangeQuick++;
  84. }
  85. }while(left<=n);
  86. if(n>0)
  87. QuickSort(a,n);
  88. if(sizeForChange>left)
  89. QuickSort(a+left,sizeForChange-left);
  90. printf("\nКолличество перестановок: %d\n",countChangeQuick);
  91. }
Спасибо.

Решение задачи: «Рекурсия выводит значение счетчика не один раз, а столько, сколько было рекурсивных вызовов»

textual
Листинг программы
  1. #include<windows.h>
  2. #include<time.h>
  3. #include<stdio.h>
  4. #include<conio.h>
  5.  
  6. void PrintArray(int*,int);
  7. void SortBalb(int*,int);
  8. void QuickSort(int*,int,int*);
  9.  
  10. void main()
  11. {
  12.     int n,*arr,*arrForBalb,*arrForQuick;
  13.     int countChangeQuick=0,countChangeQuickTemp=0;
  14.     SetConsoleCP(1251);
  15.     SetConsoleOutputCP(1251);
  16.     srand(time(NULL));
  17. //    puts("Введите размерность массива: ");
  18. //    scanf("%d",&n);
  19.     n=10;
  20.     arr=new int[n];
  21.     arrForBalb=new int[n];
  22.     arrForQuick=new int[n];
  23.     for(int i=0;i<n;i++)
  24.     {
  25.         *(arr+i)=rand()%100;
  26.         *(arrForBalb+i)=*(arr+i);       //Сразу сохраню сгенерированный массив в массивы, над которыми будем издеваться
  27.         *(arrForQuick+i)=*(arr+i);
  28.     }
  29.    
  30.     //printf("Сгенерированный массив: \n");
  31.     //PrintArray(arr,n);
  32.     printf("\n");
  33.     SortBalb(arrForQuick,n);            //Издеваемся методом пузырька
  34.     //printf("Отсортированный массив: \n");
  35.     //PrintArray(arrForModify,n);
  36.     printf("\n");
  37.     clock_t timeQuickSort=clock();
  38.     QuickSort(arrForQuick,n-1,&countChangeQuick);            //Издеваемся методом Хоара
  39.     timeQuickSort=clock()-timeQuickSort;
  40.     printf("\nВремя перестановок сортировкой Хоара: %lf секунд \n",(float)timeQuickSort/CLOCKS_PER_SEC);
  41.     printf("\nКоличество перестановок быстрой сортировкой: %d\n",countChangeQuick);
  42.  
  43.     _getch();
  44. }
  45.  
  46. void PrintArray(int*a,int n)
  47. {
  48. for(int i=0;i<n;i++)
  49.     printf("%d, ",*(a+i));
  50. }
  51.  
  52. void SortBalb(int*a,int n)
  53. {
  54.     int temp,countChange=0;
  55.     clock_t timeBalb=clock();
  56.     for(int i=0;i<n;i++)
  57.         for(int j=0;j<n-1;j++)
  58.             if(*(a+j)>*(a+j+1))
  59.             {
  60.                 temp=*(a+j+1);
  61.                 *(a+j+1)=*(a+j);
  62.                 *(a+j)=temp;
  63.                 countChange++;
  64.             }
  65.     timeBalb=clock()-timeBalb;
  66.     printf("\nВремя перестановок сортировкой обмена: %lf секунд \n",(float)timeBalb/CLOCKS_PER_SEC);
  67.     printf("\nКоличество перестановок: %d\n",countChange);
  68. }
  69.  
  70. void QuickSort(int*a,int n,int *pcountChangeQuick)
  71. {  
  72.    
  73.     int sizeForChange=n,left=0,temp;    
  74.     int pivot=*(a+(int)(n/2));
  75.     do
  76.     {
  77.     while(*(a+left)<pivot)
  78.         left++;
  79.     while(*(a+n)>pivot)
  80.         n--;
  81.     if(left<=n)
  82.     {
  83.         temp=*(a+left);
  84.         *(a+left)=*(a+n);
  85.         *(a+n)=temp;
  86.         left++;
  87.         n--;
  88.         ++(*pcountChangeQuick);
  89.     }
  90.     }while(left<=n);
  91.  
  92.     if(n>0)
  93.         QuickSort(a,n,pcountChangeQuick);
  94.     if(sizeForChange>left)
  95.         QuickSort(a+left,sizeForChange-left,pcountChangeQuick);    
  96. }

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

  1. Объявлены функции:
    • PrintArray(int*,int)
    • SortBalb(int*,int)
    • QuickSort(int,int,int)
    • main()
  2. В функции main() объявлены и инициализированы переменные:
    • n (размер массива)
    • arr (массив для сортировки)
    • arrForBalb (массив для сортировки методом пузырька)
    • arrForQuick (массив для сортировки методом Хоара)
    • countChangeQuick (счетчик перестановок быстрой сортировки)
    • countChangeQuickTemp (временная переменная для подсчета перестановок в рекурсивных вызовах быстрой сортировки)
    • timeQuickSort (время выполнения быстрой сортировки)
  3. В функции main() выполнены следующие действия:
    • Выполнен проход по массиву и заполнен массив arrForBalb значениями из arr
    • Выполнен проход по массиву и заполнен массив arrForQuick значениями из arr
    • Выполнен проход по массиву и отсортирован массив arrForBalb методом пузырька
    • Выполнен проход по массиву и отсортирован массив arrForQuick методом Хоара
    • Вычислено время выполнения быстрой сортировки
    • Выведено количество перестановок быстрой сортировки
  4. В функции SortBalb() объявлены переменные:
    • temp (временная переменная для обмена значениями)
    • countChange (счетчик перестановок при сортировке методом обмена)
    • timeBalb (время выполнения сортировки методом обмена)
  5. В функции QuickSort() объявлены переменные:
    • sizeForChange (размер сортируемого массива)
    • left (левая граница сортируемого массива)
    • n (правая граница сортируемого массива)
    • pivot (опорный элемент для разделения массива)
    • temp (временная переменная для обмена значениями)
    • *pcountChangeQuick (указатель на переменную countChangeQuick)
  6. В функции QuickSort() выполнены следующие действия:
    • Выполнен рекурсивный вызов QuickSort() для сортировки правой части массива
    • Выполнен рекурсивный вызов QuickSort() для сортировки левой части массива
    • Если left<=n, выполнен обмен значениями и увеличены left и n
    • Увеличено значение *pcountChangeQuick
  7. В функции main() выполнено 4 рекурсивных вызова QuickSort()
    • Первые два вызова используют arrForQuick в качестве входного массива
    • Третий вызов использует arrForBalb в качестве входного массива
    • Четвертый вызов использует arr в качестве входного массива
  8. В функции main() выведено значение countChangeQuick, которое увеличивается на 1 при каждом рекурсивном вызове QuickSort()
  9. Значение countChangeQuickTemp не используется в коде
  10. Значение timeQuickSort вычисляется только один раз, независимо от количества рекурсивных вызовов
  11. Значение n не изменяется в процессе выполнения программы
  12. Значение arr не изменяется в процессе выполнения программы
  13. Значение arrForBalb не изменяется в процессе выполнения программы
  14. Значение arrForQuick не изменяется в процессе выполнения программы

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


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

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

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

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

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

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