Advertisement
codegod313

Sortirovki

Jan 19th, 2020
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.16 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include <locale.h>
  4. #include <windows.h>
  5.  
  6. //int mas1[20] = { 1, 2 };
  7. //int main()
  8. //{
  9. //  extern int mas1[];  //   mas1[3] ошибка 'd' : redefinition; different subscripts
  10. //  static int mas2[4];
  11. //  int mas3[3] = { 1, 2 };
  12. //  register int mas4[3] = { 1, 2, 3 };
  13. //  //  int b[][2]={1,3,2};       //  {{1,3},{2,0}}
  14. //  //  int b[][2]={{1},{3,2}};   //  {{1,0},{3,2}}
  15. //  //  int b[][2]={{1},3,{2}};   //  {{1,0},{3,2}}
  16. //  //  int b[][2]={1,3,{2}};     //  {{1,3},{2,0}}
  17. //  //   int b[][2]={1,{3,2}};      // error
  18. //  return 0;
  19. //}
  20.  
  21.  
  22. //--------------------------------------------- 2 -----------------------------------
  23.  
  24. //#define kl1 5        // объединение 2-х массивов в третий
  25. //#define kl2 5
  26. //
  27. //void Vvod(int n, int MS[],int k)
  28. //{
  29. //  printf("введите значения в масив MS ");
  30. //  if (n == 1) printf("по возрастанию\n");
  31. //  else  printf("по убыванию\n");
  32. //  int i = 0;
  33. //  int j;
  34. //  while (i < k)
  35. //  {
  36. //      printf("MS[ %d ] = ", i);
  37. //      j=scanf("%d", &MS[i]);
  38. //      if (j && (i == 0 ||
  39. //                (n == 1 && MS[i] >= MS[i - 1]) ||
  40. //                (n == 2 && MS[i] <= MS[i - 1]) ) ) i++;
  41. //  }
  42. //}
  43. //
  44. //void Print(int MS[], int k)
  45. //{
  46. //  printf("масив  : ");
  47. //  for (int i = 0; i < k; i++)
  48. //      printf("%4d", MS[i]);
  49. //  printf("\n");
  50. //}
  51. //
  52. //int main()
  53. //{    
  54. //  setlocale(LC_ALL, "Russian");
  55. //  //const int kl1 = 5;
  56. //  //const int kl2 = 5;
  57. //  int X1[kl1], X2[kl2], X3[kl1+kl2], i1, i2, i3;
  58. //  Vvod(1,X1,kl1);
  59. //  system("CLS");                              
  60. //  Vvod(1, X2, kl2);
  61. //  system("CLS");                              
  62. //  Print(X1,kl1);
  63. //  Print(X2,kl2);
  64. //
  65. //  i1 = i2 = i3 = 0;
  66. //  do
  67. //  {
  68. //      while (X1[i1] <= X2[i2] && i1<kl1) X3[i3++] = X1[i1++];
  69. //      if (i1 >= kl1) break;
  70. //      while (X1[i1]> X2[i2] && i2<kl2) X3[i3++] = X2[i2++];
  71. //  } while (i1<kl1 && i2<kl2);
  72. //  while (i1<kl1) X3[i3++] = X1[i1++];
  73. //  while (i2<kl2) X3[i3++] = X2[i2++];
  74. //
  75. //  Print(X3, kl1+kl2);
  76. //  printf("\n");
  77. //  return 0;
  78. //}
  79.  
  80. //--------------------------------------------- 1 ------------------------------------
  81.  
  82. //#define kl 5
  83. //int main()                   // реверс элементов расположенных между MIN и MAX элементами
  84. //{
  85. //  setlocale(LC_ALL, "Russian");
  86. //  system("CLS");                     // функция очистки консоли     
  87. //  int MS[kl], i, i1, i2;
  88. //  printf("введите значения в масив MS \n");
  89. //  for (i = 0; i < kl; i++)           // цикл ввода элементов массива
  90. //  {
  91. //      printf("MS[ %d ] = ", i);
  92. //      fflush(stdin);
  93. //      // rewind(stdin);
  94. //      if (!scanf("%d", &MS[i])) i--; // проверка на то, что введена не цифра
  95. //  }
  96. //  system("CLS");                      // функция очистки консоли    
  97. //  printf("масив исходный        : "); // вывод введенного массива
  98. //  for (int i = 0; i < kl; i++)
  99. //      printf("%4d", MS[i]);
  100. //  i1 = i2 = 0;                     // индекс MIN и MAX элементов массива
  101. //  for (int i = 1; i < kl; i++)     // цикл поиска MIN и MAX
  102. //  if (MS[i] < MS[i1]) i1 = i;      // индекс нового MIN
  103. //  else if (MS[i] > MS[i2]) i2 = i; // индекс нового MAX
  104. //  if (i1>i2)                       // i1 левее i2
  105. //  {
  106. //      i = i1; i1 = i2; i2 = i;     // замена значений i1 и i2
  107. //  }
  108. //  printf("\nMIN = %4d  MAX = %4d\n", MS[i1],MS[i2]);
  109. //
  110. //  for (; i1 < i2; i1++, i2--)       // цикл реверса элементов между i1 и i2
  111. //  {
  112. //      MS[i1] += MS[i2];
  113. //      MS[i2] = MS[i1] - MS[i2];
  114. //      MS[i1] -= MS[i2];
  115. //  }
  116. //  printf("масив преобразованный : "); // вывод преобразованного массива
  117. //  for (int i = 0; i < kl; i++)
  118. //      printf("%4d", MS[i]);
  119. //  printf("\n");
  120. //  return 0;
  121. //}
  122.  
  123. //-------------------------------------------- 3 ---------------------------------
  124.  
  125. void Vvod(int[], int);
  126. void Print(int[], int);
  127. void Sort1(int, int []);
  128. void Sort2(int, int []);
  129. void Sort3(int, int []);
  130. void shaker(int, int *);
  131.  
  132. int main()                
  133. {
  134.     setlocale(LC_ALL, "Russian");
  135.     const int kl = 10;
  136.     int mas[kl];
  137.     Vvod(mas,kl);
  138.     system("CLS");           // функция очистки консоли  
  139.     Print(mas,kl);           // вывод исходного массива
  140.     printf("\nвыберите метод сортировки: 1-отбором\n");
  141.     printf("выберите метод сортировки: 2-вставками\n");
  142.     printf("выберите метод сортировки: 3-пузырьком\n");
  143.     printf("выберите метод сортировки: 3-шейкер\n");
  144.     fflush(stdin);
  145.     switch (getchar())
  146.     {
  147.        case '1': Sort1(kl, mas); break;
  148.        case '2': Sort1(kl, mas); break;
  149.        case '3': Sort3(kl, mas); break;
  150.        case '4': shaker(kl,mas); break;
  151.        default: printf("\nнеизвестный метод\n");
  152.     }
  153.     Print(mas, kl);           // вывод преобразованного массива
  154.     printf("\n");
  155.     getch();
  156.     return 0;
  157. }
  158. void Vvod(int MS[],int k)
  159. {
  160.     printf("введите значения в масив MS ");
  161.     int i = 0;
  162.     int j;
  163.     while (i < k)
  164.     {
  165.         printf("MS[ %d ] = ", i);
  166.         j=scanf("%d", &MS[i]);
  167.         if (j) i++;
  168.     }
  169. }
  170.  
  171. void Print(int MS[], int k)
  172. {
  173.     printf("масив  : ");
  174.     for (int i = 0; i < k; i++)
  175.         printf("%4d", MS[i]);
  176.     printf("\n");
  177. }
  178.                            
  179. void Sort1(int k, int ms[]) // сортировка массива  методом "через отбор"
  180. {
  181.     int i, j, m, kk;
  182.     for (i = 0; i<k-1; ++i)
  183.     {
  184.         m = i;                    // индекс элемента для упорядочивания
  185.         for (j = i + 1; j<k; ++j) // перебор последующих эл-тов справа от i-го
  186.         if (ms[j]<ms[m])          // найден меньший
  187.             m = j;                // запоминаем его индекс
  188.         kk = ms[m];
  189.         ms[m] = ms[i];            // замена выбранного и меньшего
  190.         ms[i] = kk;
  191.     }
  192. }
  193.      
  194. void Sort2(int k, int ms[]) // сортировка чисел методом "вставок"
  195. {
  196.     int i, j, m;
  197.     for (i = 1; i<k; ++i)         // индекс элемента для упорядочивания
  198.     {
  199.         j = i - 1;                // индекс предыдущего элемента
  200.         m = ms[i];                // значение предыдущего элемента
  201.         while (j >= 0 && m < ms[j])
  202.         {
  203.             ms[j-- + 1] = ms[j];  // сдвиг всех элементов направо
  204.         }
  205.         ms[j + 1] = m;            // запись в освободившийся или в тот же элемент
  206.     }
  207. }
  208.    
  209. void Sort3(int k, int ms[]) // сортировка чисел методом "пузырька"
  210. {
  211.     int i, j, m;
  212.     for (i = 0; i<k - 1; ++i)      // цикл kl-1 повтор (посл.эл-т не сорти-ся)
  213.     for (j = k - 1; j>i; --j)
  214.     {
  215.         if (ms[j - 1] > ms[j])     // сравнение 2-х соседних элементов
  216.         {                          // если правый < левого
  217.             m = ms[j - 1];         // то замена их местами
  218.             ms[j - 1] = ms[j];
  219.             ms[j] = m;
  220.         }
  221.     }
  222. }
  223. // "Шейкер" сортировка чисел
  224. void shaker(int kl, int *ms)
  225. { register int i,a,b,c,d;
  226.    c=1;
  227.    b=kl-1;   //номер элемента на котором остановка
  228.    d=kl-1;   //номер стартового элемента для сортировки справа налево
  229.    do
  230.    { for(i=d;i>=c;--i)
  231.      { if (ms[i-1]>ms[i])
  232.        { a=ms[i-1];
  233.      ms[i-1]=ms[i];
  234.      ms[i]=a;
  235.      b=i;              // крайний слева упорядоченный элемент
  236.        }
  237.      }
  238.      c=b+1;  //номер стартового элемента для сортировки слева направо
  239.      for(i=c;i<=d;++i)
  240.      { if (ms[i-1]>ms[i])
  241.        { a=ms[i-1];
  242.      ms[i-1]=ms[i];
  243.      ms[i]=a;
  244.      b=i;              // крайний слева упорядоченный элемент
  245.        }
  246.      }
  247.      d=b-1;
  248.    } while(c<=d);
  249. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement