Модифицировать алгоритм быстрой сортировки - C (СИ)

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

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

Сбивает с толку само условие: Дано масив A[n]. Модифицировать алгоритм быстрой сортировки для нахождения элемента с n/2 за величиной значением,

/*внимание*/

не упорядочивая массив. То есть, если есть массив: {7, 11, 3, 5, -8, 2}, в результате я должен получить либо 3 (если от минимального), либо 5 (если от максимального). Как понимаю, массив должен быть отсортирован лишь частично, а далее туплю Вот стандартный код...
Листинг программы
  1. void quicksort(int* a, int first, int last)
  2. {
  3. int i = first, j = last, x = a[(first + last) / 2];
  4. do {
  5. while (a[i] < x) i++;
  6. while (a[j] > x) j--;
  7. if(i <= j) {
  8. if (i < j){
  9. int dod;
  10. dod=a[i];
  11. a[i]=a[j];
  12. a[j]=dod;
  13. }
  14. i++;
  15. j--;
  16. }
  17. } while (i <= j);
  18. if (i < last)
  19. quicksort(a, i, last);
  20. if (first < j)
  21. quicksort(a, first,j);
  22. }

Решение задачи: «Модифицировать алгоритм быстрой сортировки»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <windows.h>
  4.  
  5. #define KOLVO 9
  6.  
  7. int kilk_el (int mas1[]);
  8. int quicksort (int* , int, int, int);
  9.  
  10. int kilk_ob_rec, kilk_por_rec;
  11.  
  12. int main()
  13. {
  14.     SetConsoleCP(1251);
  15.     SetConsoleOutputCP(1251);
  16.  
  17.     int q1[100];
  18.  
  19.     printf("Arr:\n");
  20.     int size = 0;
  21.     size = kilk_el(q1);
  22.  
  23.     fflush(stdin);
  24.  
  25.     //system("cls");
  26.     int el;
  27.     el = quicksort(q1, 0, size - 1, (size - 1) / 2);
  28.  
  29.     printf("\n\n");
  30.     printf ("%d",el);
  31.  
  32.     getch();
  33. }
  34.  
  35. int kilk_el(int mas1[]){
  36.  
  37.     int * p1 = mas1;
  38.     int i=0;
  39.     int K=0;
  40.     while(i<KOLVO){
  41.         if (scanf("%d",(p1 + i))==0)
  42.             break;
  43.         else
  44.             mas1[K++]=mas1[i];
  45.         i++;
  46.     }
  47.     return i;
  48. }
  49.  
  50. int quicksort(int* a, int first, int last, int mediana){
  51.     int smth = (first + last) / 2;
  52.     int i = first, j = last, x = a[smth];
  53.     do {
  54.         while (a[i] < x) i++;
  55.         while (a[j] > x) j--;
  56.         //smth = j;
  57.         if(i <= j) {
  58.             if (i < j){
  59.                 int dod;
  60.                 dod=a[i];
  61.                 a[i]=a[j];
  62.                 a[j]=dod;
  63.             if (a[j] == x) // сохраняю индекс начального элемента если он берет участие в обмене местами
  64.                 smth = j;
  65.             else
  66.                 if (a[i] == x)
  67.                     smth = i;
  68.                
  69.             }
  70.             i++;
  71.             j--;
  72.         }
  73.     } while (i <= j);
  74.  
  75.     if (mediana == smth)
  76.         return x;
  77.     else
  78.         if (mediana < smth){
  79.             if (smth % 2 == 0) /* если честно, не знаю зачем делаю проверку тут и далее на smth % 2, но зависимо от количества элементов массива границы будут или не будут включать поставленные элемент (на бумажке тестил) */
  80.                 quicksort(a, first, smth , mediana);
  81.             else
  82.                 quicksort(a, first - 1, smth , mediana);
  83.         }
  84.         else
  85.             if (mediana > smth){
  86.                 if (smth % 2 == 0)
  87.                     quicksort(a, smth, last,  mediana );
  88.                 else
  89.                     quicksort(a, smth + 1, last,  mediana );
  90.             }
  91. }

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


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

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

10   голосов , оценка 4.1 из 5

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

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

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