Advertisement
Guest User

Untitled

a guest
Oct 13th, 2015
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.34 KB | None | 0 0
  1. // Подключение библиотек
  2. #include <iostream> // Библиотека для реализации ввода-вывода
  3. #include <vector>   // Библиотека для работы с векторами
  4. #include <string>   // Библиотека для работы со строками
  5. #include <fstream>  // Библиотека для работы с файлами
  6. #include <ctime>    // Для работы со временем
  7. #include <iterator> // Заголовочный файл итераторов
  8. #include <algorithm>// Тестим стандартную функцию sort
  9.  
  10. // Используем стандартное пространство имен
  11. using namespace std;
  12.  
  13. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  14. // Простой обмен (пузырек)
  15. // Каждый элемент попарно сравнивается с предыдущим
  16. // Если предыдущий элемент больше текущего, то они меняются местами
  17. // Таким образом происходит смещение минимумов в начало массива
  18. // Повторяем выше изложенные действия для всех элементов, кроме первого (n-1-i) и т.д.
  19. void bubble(double *mas, int n)
  20. {
  21.     double t=0;                        // t - для временного хранения элемента массива
  22.     for(int i=n-1; i>=0; i--)          // i - номер текущего прохода массива.
  23.     {                                  // Изменяется от n-1 (последнего элемента) до первого элемента
  24.         for(int j=n-1; j>(n-1-i); j--) // j - номер элемента. После каждого прохода кол-во элементов сокращается на 1
  25.                                        // так как после каждой итерации в начале будут появляться минимумы
  26.         {
  27.             if (mas[j-1] > mas[j])     // Если предыдущий элемент больше текущего, то они меняются местами
  28.             {
  29.                 t=mas[j];
  30.                 mas[j] = mas[j-1];
  31.                 mas[j-1] = t;
  32.             }
  33.         }
  34.     }
  35. }
  36. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  37. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38. // Простой обмен для вектора
  39. void bubble_vector(vector<double> &myVector)
  40. {
  41.     double t=0;                        
  42.     for(int i=myVector.size()-1; i>=0; i--)          
  43.     {                                  
  44.         for(int j=myVector.size()-1; j>(myVector.size()-1-i); j--)
  45.                                        
  46.         {
  47.             if (myVector[j-1] > myVector[j])    
  48.             {
  49.                 t=myVector[j];
  50.                 myVector[j] = myVector[j-1];
  51.                 myVector[j-1] = t;
  52.             }
  53.         }
  54.     }
  55. }
  56. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  57. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58. // Простой выбор
  59. // 1. Организуем поиск минимума в массиве
  60. // 2. Меняем местами первый элемент и минимум
  61. // 3. Повторяем алгоритм для элементов, исключая первый
  62. void simple_choice(double *mas, int n) // В качестве аргументов указатель на массив и его размер
  63. {
  64.     double min;                        // Хранит минимум
  65.     int index = 0;                     // Хранит индекс минимума
  66.     for(int i=0; i<(n-1); i++)             // Обходим все элементы
  67.     {
  68.         min = mas[i];
  69.         index=i;
  70.         for(int j=i+1; j<n; j++)         // Ищим минимум
  71.         {
  72.             if (min > mas[j])
  73.             {
  74.                 min = mas[j];          // Запоминаем минимум и его индекс
  75.                 index = j;
  76.             }
  77.         }
  78.  
  79.         mas[index] = mas[i];           // Меняем местами минимум и элемент с индексом i.
  80.         mas[i] = min;
  81.     }
  82. }
  83. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  84. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  85. // Простой выбор для вектора
  86. void simple_choice_vector(vector<double> &myVector)
  87. {
  88.     double min;                        
  89.     int index = 0;                    
  90.     for(int i=0; i<(myVector.size()-1); i++)            
  91.     {
  92.         min = myVector[i];
  93.         index = i;
  94.         for(int j=i+1; j<myVector.size(); j++)        
  95.         {
  96.             if (min > myVector[j])
  97.             {
  98.                 min = myVector[j];          
  99.                 index = j;
  100.             }
  101.         }
  102.  
  103.         myVector[index] = myVector[i];          
  104.         myVector[i] = min;
  105.     }
  106. }
  107. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  108. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  109. // Простое включение
  110. // Начиная со второго элемента, сравниваем все предыдущие элементы с текущим.
  111. // В случае, если предыдущий элемент оказался большим, меняем местами текущий и предыдущий
  112. void simple_including(double *mas, int n)
  113. {
  114.     // Переменная для временного хранения элементов массива
  115.     double t = 0;
  116.     // Начиная со второго элемента
  117.     for(int i=1; i<n; i++)
  118.     {
  119.         // Проверяем все предыдущие элементы
  120.         for(int j=0; j<i; j++)
  121.         {
  122.             // Если один из предыдущих больше текущего, меняем местами
  123.             if (mas[j] > mas[i])
  124.             {
  125.                 t = mas[j];
  126.                 mas[j] = mas[i];
  127.                 mas[i] = t;
  128.             }
  129.         }
  130.     }
  131. }
  132. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  133. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  134. // Простое включение для вектора
  135. void simple_including_vector(vector<double> &myVector)
  136. {
  137.     double t = 0;
  138.     for(int i=1; i<myVector.size(); i++)
  139.     {
  140.         for(int j=0; j<i; j++)
  141.         {
  142.             if (myVector[j] > myVector[i])
  143.             {
  144.                 t = myVector[j];
  145.                 myVector[j] = myVector[i];
  146.                 myVector[i] = t;
  147.             }
  148.         }
  149.     }
  150. }
  151. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  152. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  153. // Вывод вектора на экран
  154. // Вывод производится в цикле
  155. void show_vector(vector<double> &myVector)
  156. {
  157.     cout<<endl<<"The vector: "<<endl;
  158.     for(int i=0; i<myVector.size(); i++)
  159.     {
  160.         cout<<myVector[i]<<" ";
  161.     }
  162. }
  163. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  164. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  165. // Альтернативная реализация вывода вектора на экран (используя итераторы)
  166. void show_vector_alt(vector<double> &myVector)
  167. {
  168.     copy(myVector.begin(),  // Итератор начала массива
  169.          myVector.end(),    // Итератор конца массива
  170.          ostream_iterator<double>(cout, " ")); 
  171. }
  172. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  173. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  174. // Функция для вывода массива на экран
  175. void show_massive(double *mas, int n)
  176. {
  177.     cout<<endl<<"The array: "<<endl;
  178.     for(int i=0; i<n; i++)
  179.     {
  180.         cout<<mas[i]<<" ";
  181.     }
  182. }
  183. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  184. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  185. // Функция для заполнения вектора случайными числами
  186. void fill_vector(vector<double> &myVector)
  187. {
  188.     srand(time(NULL)); // Для того, чтобы при повторном запуске программы выводились другие числа
  189.     for(int i=0; i<myVector.size(); i++)
  190.     {
  191.         myVector[i] = rand()%10000;
  192.     }
  193. }
  194.  
  195. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  196. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  197. // Функция для заполнения масива случайными числами
  198. void fill_massive(double *mas, int n)
  199. {
  200.     srand(time(NULL));
  201.     for(int i=0; i<n; i++)
  202.     {
  203.         mas[i] = rand()%10000;
  204.     }
  205. }
  206. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  207. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  208. // Функция для организации ввода элементов массива с клавиатуры
  209. void enter_massive(double *mas, int n)
  210. {
  211.     cout<<endl<<"Enter "<<n<<" elements in the array:"<<endl;
  212.     for(int i=0; i<n; i++)
  213.     {
  214.         cin>>mas[i];
  215.     }
  216. }
  217. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  218. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  219. // Производим сортировку всеми методами. Результаты сравниваем
  220. void compare(vector<double> &myVector, double *mas, int n)
  221. {
  222.     clock_t start;   // Количество временных тактов до запуска алгоритма сортировки
  223.     clock_t stop;    // Количество временных тактов после запуска алгоритма
  224.     cout<<endl<<"Comparison for array:"<<endl;
  225.  
  226.     fill_massive(mas, n); // Каждый раз заново заполняем массив для более объективной оценки
  227.     start = clock(); // Запоминаем кол-во временных тактов
  228.     bubble(mas, n);
  229.     stop = clock();  // Запоминаем новое кол-во временных тактов
  230.     cout<<endl<<"THE BUBBLE SORT. Time of sorting: "
  231.         <<double(stop-start) / CLOCKS_PER_SEC<<" seconds";
  232.  
  233.     fill_massive(mas, n);
  234.     start = clock();
  235.     simple_choice(mas, n);
  236.     stop = clock();  // Запоминаем новое кол-во временных тактов
  237.     cout<<endl<<"THE SIMPLE CHOICE. Time of sorting: "
  238.         <<double(stop-start) / CLOCKS_PER_SEC<<" seconds";
  239.  
  240.     fill_massive(mas, n);
  241.     start = clock();
  242.     simple_including(mas, n);
  243.     stop = clock();  // Запоминаем новое кол-во временных тактов
  244.     cout<<endl<<"THE SIMPLE INCLUDING. Time of sorting: "
  245.         <<double(stop-start) / CLOCKS_PER_SEC<<" seconds";
  246.     start = clock();
  247.     sort(mas, mas + n);
  248.     stop = clock();
  249.     cout<<endl<<"SORT. Time of sorting: "
  250.         <<double(stop-start) / CLOCKS_PER_SEC<<" seconds";
  251.  
  252.     cout<<endl<<endl<<"Comparison for vector:"<<endl;
  253.     fill_vector(myVector);
  254.     start = clock();
  255.     simple_choice_vector(myVector);
  256.     stop = clock();  // Запоминаем новое кол-во временных тактов
  257.     cout<<endl<<"THE SIMPLE CHOICE. Time of sorting: "
  258.         <<double(stop-start) / CLOCKS_PER_SEC<<" seconds";
  259.    
  260.     fill_vector(myVector); // Каждый раз заново заполняем массив для более объективной оценки
  261.     start = clock(); // Запоминаем кол-во временных тактов
  262.     bubble_vector(myVector);
  263.     stop = clock();  // Запоминаем новое кол-во временных тактов
  264.     cout<<endl<<"THE BUBBLE SORT. Time of sorting: "
  265.         <<double(stop-start) / CLOCKS_PER_SEC<<" seconds";
  266.  
  267.     fill_vector(myVector);
  268.     start = clock();
  269.     simple_including_vector(myVector);
  270.     stop = clock();  // Запоминаем новое кол-во временных тактов
  271.     cout<<endl<<"THE SIMPLE INCLUDING. Time of sorting: "
  272.         <<double(stop-start) / CLOCKS_PER_SEC<<" seconds";
  273.     start = clock();
  274.     sort(myVector.begin(), myVector.end());
  275.     stop = clock();
  276.     cout<<endl<<"SORT. Time of sorting: "
  277.         <<double(stop-start) / CLOCKS_PER_SEC<<" seconds";
  278. }
  279. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  280. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  281. // Считывание массива из файла
  282. void read_from_file(const string filename, double *mas)
  283. {   int n=0; // Количество элементов
  284.     fstream fi;
  285.     fi.open(filename, ios::in);
  286.     fi>>n;
  287.     for(int i=0; i<n; i++)
  288.     {
  289.         fi >> mas[i];
  290.     }
  291. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement