Advertisement
Guest User

Лаб 5.2

a guest
May 29th, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.61 KB | None | 0 0
  1. /*Алгоритмы
  2. - простого выбора;
  3. - пузырьковая сортировка;
  4. - Хоара.
  5. */
  6. #include <iostream>
  7. #include <ctime>
  8. #include "windows.h"
  9.  
  10. using namespace std;
  11.  
  12. int Init(int *array,  int n)
  13. {
  14.     srand(time(0));     // генерация случайных чисел
  15.      
  16.     for (int i = 0; i < n; i++)
  17.     {
  18.         array[i] = (rand() % 10);
  19.     }
  20.  
  21.     return 0;
  22. }
  23.  
  24. int Print(int *array, int n)
  25. {
  26.     for (int i = 0; i < n; i++)
  27.     {
  28.         cout << array[i] << " ";
  29.     }
  30.     return 0;
  31. }
  32.  
  33. /*Идея метода состоит в том, чтобы создавать отсортированную последовательность путем
  34.   присоединения к ней одного элемента за другим в правильном порядке.
  35.   Если входная последовательность почти упорядочена, то сравнений будет столько же, значит
  36.   алгоритм ведет себя неестественно.*/
  37.  
  38. void selectSort(int *array, int n)
  39. {
  40.     int tmp;
  41.     for (int i = 0; i < n; ++i)          // i - номер текущего шага
  42.     {
  43.         int pos = i;
  44.         tmp = array[i];
  45.         for (int j = i + 1; j < n; ++j) // цикл выбора наименьшего элемента
  46.         {
  47.             if (array[j] < tmp)
  48.             {
  49.                 pos = j;
  50.                 tmp = array[j];
  51.             }
  52.         }
  53.         array[pos] = array[i];
  54.         array[i] = tmp; // меняем местами наименьший с a[i]
  55.     }
  56. }
  57.  
  58. /*Идея метода: шаг сортировки состоит в проходе снизу вверх по массиву.
  59. По пути просматриваются пары соседних элементов. Если элементы некоторой пары находятся
  60. в неправильном порядке, то меняем их местами.*/
  61.  
  62. void bubbleSort(int *array, int n)
  63. {
  64.     int tmp;
  65.  
  66.     for (int i = 0; i < n - 1; ++i) // i - номер прохода
  67.     {
  68.         for (int j = 0; j < n - 1; ++j) // внутренний цикл прохода
  69.         {
  70.             if (array[j + 1] < array[j])
  71.             {
  72.                 tmp = array[j + 1];
  73.                 array[j + 1] = array[j];
  74.                 array[j] = tmp;
  75.             }
  76.         }
  77.     }
  78. }
  79.  
  80.  
  81. /*Каждое разделение требует, очевидно, O(n) операций. Количество шагов деления(глубина рекурсии)
  82. составляет приблизительно log n, если массив делится на более-менее равные части. Таким образом,
  83. общее быстродействие: O(n log n), что и имеет место на практике.
  84. Итеративный алгоритм быстрой сортировки.
  85.  
  86. Итеративная QuickSort (массив a, размер size)
  87. {
  88. Положить в стек запрос на сортировку массива от 0 до size-1.
  89. do {
  90. Взять границы lb и ub текущего массива из стека.
  91. do {
  92. 1. Произвести операцию разделения над текущим массивом a[lb..ub].
  93. 2. Отправить границы большей из получившихся частей в стек.
  94. 3. Передвинуть границы ub, lb чтобы они указывали на меньшую часть.
  95. } пока меньшая часть состоит из двух или более элементов
  96. } пока в стеке есть запросы
  97. }
  98. */
  99.  
  100. #define MAXSTACK 2048 // максимальный размер стека
  101.  
  102. void qSortI(int *array, int n)
  103. {
  104.  
  105.     long i, j; // указатели, участвующие в разделении
  106.     long lb, ub; // границы сортируемого в цикле фрагмента
  107.  
  108.     long lbstack[MAXSTACK], ubstack[MAXSTACK]; // стек запросов
  109.                                                // каждый запрос задается парой значений,
  110.                                                // а именно: левой(lbstack) и правой(ubstack)
  111.                                                // границами промежутка
  112.     long stackpos = 1; // текущая позиция стека
  113.     long ppos; // середина массива
  114.     int pivot; // опорный элемент
  115.     int temp;
  116.  
  117.     lbstack[1] = 0;
  118.     ubstack[1] = n - 1;
  119.  
  120.     do {
  121.         // Взять границы lb и ub текущего массива из стека.
  122.         lb = lbstack[stackpos];
  123.         ub = ubstack[stackpos];
  124.         stackpos--;
  125.  
  126.         do {
  127.             // Шаг 1. Разделение по элементу pivot
  128.             ppos = (lb + ub) >> 1;
  129.             i = lb; j = ub; pivot = array[ppos];
  130.             do {
  131.                 while (array[i] < pivot) i++;
  132.                 while (pivot < array[j]) j--;
  133.                 if (i <= j) {
  134.                     temp = array[i]; array[i] = array[j]; array[j] = temp;
  135.                     i++; j--;
  136.                 }
  137.             } while (i <= j);
  138.  
  139.             // Сейчас указатель i указывает на начало правого подмассива,
  140.             // j - на конец левого (см. иллюстрацию выше), lb ? j ? i ? ub.
  141.             // Возможен случай, когда указатель i или j выходит за границу массива
  142.  
  143.             // Шаги 2, 3. Отправляем большую часть в стек и двигаем lb,ub
  144.             if (i < ppos) { // правая часть больше
  145.                 if (i < ub) { // если в ней больше 1 элемента - нужно
  146.                     stackpos++; // сортировать, запрос в стек
  147.                     lbstack[stackpos] = i;
  148.                     ubstack[stackpos] = ub;
  149.                 }
  150.                 ub = j; // следующая итерация разделения
  151.                         // будет работать с левой частью
  152.             }
  153.             else { // левая часть больше
  154.                 if (j > lb) {
  155.                     stackpos++;
  156.                     lbstack[stackpos] = lb;
  157.                     ubstack[stackpos] = j;
  158.                 }
  159.                 lb = i;
  160.             }
  161.         } while (lb < ub); // пока в меньшей части более 1 элемента
  162.     } while (stackpos != 0); // пока есть запросы в стеке
  163. }
  164.  
  165.  
  166.  
  167. void Error(char c)
  168. {
  169.     std :: cout << "\nТакого алгоритма нет, повторите свой выбор :\n ";
  170.     while (!(std :: cin >> c))     // если ввод не удался, то входим в цикл
  171.     {
  172.         std :: cout << "\nОшибочный ввод! Попытайся еще раз..." << endl;
  173.         std :: cin.clear();           // очистка потока что бы продолжался ввод
  174.  
  175.                                // считываем элементы в потоке по символу. Удаляем ненужные символы,
  176.                                //  пока символ не равен переводу на новую строку - удаляем его.
  177.         while (std :: cin.get() != '\n');
  178.         {
  179.             std::cout << "Введи значение : ";
  180.         }
  181.     }
  182. }
  183.  
  184.  
  185.  
  186. int main()
  187. {
  188.     setlocale(LC_ALL, "");
  189.  
  190.     int n;
  191.     char c;
  192.     bool f = true;
  193.    
  194.     cout << "Введите размер массива : ";
  195.     cin >> n;
  196.     int *array = new int[n];
  197.      
  198.    
  199.     do {
  200.     std::cout << "Выберите алгоритм сортировки : \n" << endl;
  201.     std::cout << "1) Сортировка методом протсого выбора " << endl;
  202.     std::cout << "2) Сортировка методом пузырька " << endl;
  203.     std::cout << "3) Сортировка методом Хоара \n" << endl;
  204.     //std::cout << "5) Выход.\n" << endl;
  205.  
  206.        
  207.     std :: cout << "Алгоритм №  ";
  208.     std :: cin >> c;
  209.    
  210.     //cout << "Введи значение " << i << " элемента массива : ";
  211.  
  212.     switch (c)
  213.     {
  214.  
  215.     case '1':
  216.         cout << "\n Исходный массив :        ";
  217.         Init(array, n);
  218.         Print(array, n);
  219.         cout << "\n Отсортированный массив : ";
  220.         selectSort(array, n);
  221.         Print(array, n);
  222.         cout << "\n------------------------------------------------------------------------|" << endl;
  223.         break;
  224.  
  225.     case '2':
  226.         cout << "\n Исходный массив :        ";
  227.         Init(array, n);
  228.         Print(array, n);
  229.         cout << "\n Отсортированный массив : ";
  230.         bubbleSort(array, n);
  231.         Print(array, n);
  232.         cout << "\n------------------------------------------------------------------------|" << endl;
  233.         break;
  234.  
  235.     case '3':
  236.         cout << "\n Исходный массив :        ";
  237.         Init(array, n);
  238.         Print(array, n);
  239.         cout << "\n Отсортированный массив : ";
  240.         qSortI(array, n);
  241.         Print(array, n);
  242.         cout << "\n------------------------------------------------------------------------|" << endl;
  243.         break;
  244.  
  245.     default: f = false;
  246.              Error(c);
  247.  
  248.     }
  249.     //system("cls");
  250.     } while (c ='4');
  251.  
  252.     std :: cout << endl;
  253.  
  254.     system("pause");
  255.     return 0;
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement