Vlad3955

Quick Sort MOD

Dec 20th, 2021 (edited)
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.75 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <time.h>
  5. #include <locale.h>
  6. #include <math.h>
  7.  
  8. // Функции заполнения и вывода двумерных мвссивов и функции swap
  9. void swapInt(int *a, int *b) {
  10.     int t = *a;
  11.     *a = *b;
  12.     *b = t;
  13. }
  14.  
  15. // QUICKSORT and QUICKSORT FAST
  16.  
  17. void fillIntRandom(int* array, int size, int border) {
  18.     srand(time(NULL));
  19.     for (int i = 0; i < size; ++i)
  20.         *(array + i) = rand() % border;
  21. }
  22.  
  23. void printIntArray(int* array, int size, int offset) {
  24.     char format[7];
  25.     sprintf(format, "%%%dd", offset);
  26.     for (int i = 0; i < size; ++i) {
  27.         printf(format, array[i]);
  28.         if (i != size - 1)
  29.             printf(",");
  30.     }
  31.     printf("\n");
  32. }
  33.  
  34.  
  35.  
  36.  
  37. // QUICKSORT FAST
  38. // Первоначальный вариант
  39. /*int median (int* a, int* b, int* c)
  40. {
  41.     if (*a > *b)
  42.     {
  43.         if (*c > *a)
  44.         {
  45.             return *a;
  46.         }
  47.         return (*b > *a) ? *b : *c;
  48.     }
  49.     if (*c > *b)
  50.     {
  51.         return *b;
  52.     }
  53.     return (*a > *c) ? *a : *c;
  54. }*/
  55.  
  56. // Вроде что-то не то
  57. int median (int* a, int* b, int* c)
  58. {
  59.  
  60.     if (*a > *b)
  61.     {
  62.        int t = *a;
  63.        *a = *b;
  64.        *b = t;
  65.     }
  66.     if (*b > *c)
  67.     {
  68.         int t = *b;
  69.         *b = *c;
  70.         *c = t;
  71.     }
  72.     if (*a > *b)
  73.     {
  74.         int t = *a;
  75.         *a = *b;
  76.         *b = t;
  77.     }
  78.  
  79. void qsf(int* arr, int first, int last)
  80. {
  81.     int i = first;
  82.     int j = last;
  83.    
  84.     // Сортировка вставками которая должна отрабатывать в рекурсии по идее
  85.     if (arr[(last - first)] <= 10)
  86.     {
  87.         int temp, pos;
  88.         for (int i = first; i <= last; ++i)
  89.         {
  90.            temp = arr[i];
  91.            pos = i - 1;
  92.            while (pos >= 0 && arr[pos] > temp)
  93.            {
  94.               arr[pos + 1] = arr[pos];
  95.               pos--;
  96.            }
  97.            arr[pos + 1] = temp;
  98.         }
  99.     }
  100.  
  101.       int x = median(&arr[first], &arr[(first + last) / 2], &arr[last]);
  102.  
  103.     do {
  104.         while (arr[i] < x)
  105.         {
  106.             i++;
  107.         }
  108.         while (arr[j] > x)
  109.         {
  110.             j--;
  111.         }
  112.         if (i <= j)
  113.         {
  114.             swapInt(&arr[i], &arr[j]);
  115.             i++;
  116.             j--;
  117.         }
  118.     } while (i <= j);
  119.  
  120.     if (i < last)
  121.     {
  122.         qs(arr, i, last);
  123.     }
  124.     if (first < j)
  125.     {
  126.         qs(arr, first, j);
  127.     }
  128. }
  129.  
  130.  
  131. int main()
  132. {
  133.   setlocale(LC_ALL, "rus");
  134.  
  135.   // QUICKSORT
  136.   const int SZ = 30;
  137.   int arr[SZ];
  138.   fillIntRandom(arr, SZ, 100);
  139.   printIntArray(arr, SZ, 3);
  140.   qsf(arr, 0, SZ - 1);
  141.   printIntArray(arr, SZ, 3);
  142.  
  143.   // QUICKSORT FAST
  144.   return 0;
  145. }
  146.  
Add Comment
Please, Sign In to add comment