Bibodui

Sortings 2

Jan 24th, 2021 (edited)
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.46 KB | None | 0 0
  1. void Exchange(int i, int j, int* array)//костыль swap
  2. {
  3.     int tmp;
  4.     tmp = array[i];
  5.     array[i] = array[j];
  6.     array[j] = tmp;
  7. }
  8.  
  9. void Hoar_Sort(int size, int* array)
  10. {
  11.     Quick_Sort(0, size - 1, array);
  12. }
  13.  
  14. void Quick_Sort(int left, int right, int* array)
  15. {
  16.     int i, j, m;
  17.     i = left;
  18.     j = right;
  19.  
  20.     m = array[(i + j + 1) / 2];
  21.     do
  22.     {
  23.         while (array[i] < m && compare1++)
  24.             i++;
  25.         while (array[j] > m && compare1++)
  26.             j--;
  27.         if (i <= j)
  28.         {
  29.             Exchange(i, j, array);
  30.             replace1++;
  31.             i++;
  32.             j--;
  33.         }
  34.  
  35.     } while (i <= j);
  36.     if (left < j && compare1++) Quick_Sort(left, j, array);
  37.     if (i < right && compare1++) Quick_Sort(i, right, array);
  38. }
  39.  
  40. void Binary_Pyramid_Sort(int size, int* array)
  41. {
  42.     //преобразование массива в пирамиду
  43.     Build_Pyramid(size / 2 + 1, size - 1, array);
  44.     //сортировка пирамиды
  45.     Sort_Piramid(size - 1, array);
  46. }
  47.  
  48. void Build_Pyramid(int size, int r, int* array)
  49. {
  50.     //просеивание элементов пирамиды
  51.     Sifting(size, r, array);
  52.     if (size > 0)
  53.         //рекурсивно вызываем функцию построения
  54.         Build_Pyramid(size - 1, r, array);
  55. }
  56.  
  57. void Sort_Piramid(int size, int* array)
  58. {
  59.     //переставляем первый элемент пирамиды с последним
  60.     Exchange(0, size, array);
  61.     replace2++;
  62.     //исключаем последний элемент пирамиды
  63.     Sifting(0, size - 1, array);
  64.     //добиваемся того, чтобы массив снова стал пирамидой
  65.     if (size > 1)
  66.         Sort_Piramid(size - 1, array);
  67. }
  68.  
  69. void Sifting(int left, int right, int* array)
  70. {
  71.     //принцип: каждый потомок должен быть меньше, чем родитель
  72.     int q, p;
  73.     q = 2 * left + 1;  //индекс левого элемента
  74.     p = q + 1;  //индекс правого элемента
  75.     if (q <= right && compare2++)
  76.     {
  77.  
  78.         if (p <= right && array[p] > array[q] && compare2++)
  79.             q = p;
  80.  
  81.         if (array[left] < array[q] && compare2++)
  82.         {
  83.             Exchange(left, q, array);
  84.             replace2++;
  85.             Sifting(q, right, array);
  86.         }
  87.     }
  88. }
  89.  
  90. void BubbleSort(int size, int* array)//сортировка пузырьком
  91. {
  92.     int i, j, buf;
  93.     for (i = size - 1; i > 0; i--)
  94.         for (j = 0; j < i; j++)
  95.         {
  96.             compare3++;
  97.             if (array[j] > array[j + 1])
  98.             {
  99.                 buf = array[j];
  100.                 array[j] = array[j + 1];
  101.                 array[j + 1] = buf;
  102.                 replace3++;
  103.             }
  104.         }
  105. }
  106.  
  107. void Shaker(int k, int* x)//шейкерная сортировка
  108. {
  109.     int i, t;
  110.     bool exchange;
  111.     do {
  112.         exchange = false;
  113.         for (i = k - 1; i > 0; --i) {
  114.             if (x[i - 1] > x[i]) {
  115.                 t = x[i - 1];
  116.                 x[i - 1] = x[i];
  117.                 x[i] = t;
  118.                 exchange = true;
  119.  
  120.             }
  121.         }
  122.  
  123.         for (i = 1; i < k; ++i) {
  124.             if (x[i - 1] > x[i]) {
  125.                 t = x[i - 1];
  126.                 x[i - 1] = x[i];
  127.                 x[i] = t;
  128.                 exchange = true;
  129.  
  130.             }
  131.         }
  132.     } while (exchange);
  133. }
  134.  
  135. void InsertSort(int k, int* x)//вставками
  136. {
  137.     int i, j, temp;
  138.     for (i = 0; i < k; i++) {
  139.         //цикл проходов, i - номер прохода
  140.         temp = x[i];
  141.         //поиск места элемента
  142.         for (j = i - 1; j >= 0 && x[j] > temp; j--)
  143.             x[j + 1] = x[j];//сдвигаем элемент вправо, пока не дошли
  144.             //место найдено, вставить элемент
  145.         x[j + 1] = temp;
  146.     }
  147. }
  148.  
  149. void Shell(int size, int* a)//Сортировка Шелла
  150. {
  151.     int step = size / 2;//инициализируем шаг.
  152.     while (step > 0)//пока шаг не 0
  153.     {
  154.         for (int i = 0; i < (size - step); i++)
  155.         {
  156.             int j = i; //будем идти начиная с i-го элемента
  157.             while (j >= 0 && a[j] > a[j + step])
  158.     //пока не пришли к началу массива
  159.     //и пока рассматриваемый элемент больше
  160.     //чем элемент находящийся на расстоянии шага
  161.             {
  162.                 //меняем их местами
  163.                 int temp = a[j];
  164.                 a[j] = a[j + step];
  165.                 a[j + step] = temp;
  166.                 j--;
  167.             }
  168.         }
  169.         step = step / 2;//уменьшаем шаг
  170.     }
  171. }
  172.  
  173. void Quick_Sort(int* mas, int first, int last)//быстрая сортировка Хоара
  174. {
  175.     int mid, count;
  176.     int f = first, l = last;
  177.     mid = mas[(f + l) / 2]; //вычисление опорного элемента
  178.     do
  179.     {
  180.         while (mas[f] < mid) f++;
  181.         while (mas[l] > mid) l--;
  182.         if (f <= l) //перестановка элементов
  183.         {
  184.             count = mas[f];
  185.             mas[f] = mas[l];
  186.             mas[l] = count;
  187.             f++;
  188.             l--;
  189.         }
  190.     } while (f < l);
  191.     if (first < l) Quick_Sort(mas, first, l);
  192.     if (f < last) Quick_Sort(mas, f, last);
  193. }
  194.  
  195.  
Add Comment
Please, Sign In to add comment