Advertisement
Infiniti_Inter

MTR sort

Jun 22nd, 2019
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. // Диагонали, параллельные побочной по убыванию с помощью сортировки перемешиванием.
  2.  
  3. #include <fstream>
  4. #include <iomanip>
  5. #include <iostream>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. ifstream in("input.txt");
  10. ofstream out("output.txt");
  11.  
  12. void print(int **a, int n)
  13. {
  14.     out << n << endl;
  15.     for (int i = 0; i < n; i++, out << endl)
  16.         for (int j = 0; j < n; j++)
  17.             out << setw(5) << left << a[i][j];
  18. }
  19.  
  20. void shekerSort(int a[], int n)
  21. {
  22.     int left = 0, right = n - 1; // левая и правая границы сортируемой области массива
  23.     int flag = 1;  // флаг наличия перемещений
  24.                    // Выполнение цикла пока левая граница не сомкнётся с правой
  25.                    // или пока в массиве имеются перемещения
  26.     while ((left < right) && flag > 0)
  27.     {
  28.         flag = 0;
  29.         for (int i = left; i < right; i++)  //двигаемся слева направо
  30.         {
  31.             if (a[i] > a[i + 1]) // если следующий элемент меньше текущего,
  32.             {             // меняем их местами
  33.                 int t = a[i];
  34.                 a[i] = a[i + 1];
  35.                 a[i + 1] = t;
  36.                 flag = 1;      // перемещения в этом цикле были
  37.             }
  38.         }
  39.         right--; // сдвигаем правую границу на предыдущий элемент
  40.         for (int i = right; i > left; i--)  //двигаемся справа налево
  41.         {
  42.             if (a[i - 1] > a[i]) // если предыдущий элемент больше текущего,
  43.             {            // меняем их местами
  44.                 int t = a[i];
  45.                 a[i] = a[i - 1];
  46.                 a[i - 1] = t;
  47.                 flag = 1;    // перемещения в этом цикле были
  48.             }
  49.         }
  50.         left++; // сдвигаем левую границу на следующий элемент
  51.     }
  52. }
  53.  
  54. int main() {
  55.     setlocale(LC_ALL, "Russian");
  56.     int n, k, i, j;
  57.  
  58.     in >> n;
  59.     int **a = new int*[n];
  60.     for (int i = 0; i < n; i++)
  61.         a[i] = new int[n];
  62.     for (int i = 0; i < n; i++)
  63.         for (int j = 0; j < n; j++)
  64.             in >> a[i][j];
  65.  
  66.     int b[100]; int c[100];
  67.     for (k = 1; k < n; k++) {
  68.    
  69.         for (i = k, j = 0; i >= 0; i--, j++) {
  70.             b[j] = a[i][j];
  71.         }
  72.         shekerSort(b, k + 1);
  73.         for (i = k, j = 0; i >= 0; i--, j++) {
  74.             a[i][j] = b[j];
  75.         }
  76.  
  77.         for (j = n - k, i = n - 1; i >= 0; i--, j++) {
  78.             c[j] = a[i][j];
  79.         }
  80.         shekerSort(c, n);
  81.         for (j = n - k, i = n - 1; i >= 0; i--, j++) {
  82.             a[i][j] = c[j];
  83.         }
  84.     }
  85.  
  86.     print(a, n);
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement