Advertisement
turtlesergio

Untitled

Mar 6th, 2015
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <time.h>
  4. using namespace std;
  5.  
  6. class Array //объявляем класс "Массив"
  7. {
  8. public:
  9.     void fill(int n, int *a) //метод для заполнения массива
  10.     {
  11.         srand(time(NULL));
  12.         for (int i = 0; i < n; i++) //заполняем массив случайными значениями
  13.         {
  14.             a[i] = rand() % 100;
  15.         }
  16.     }
  17.     void print(int n, int *a, bool mode) //метод для вывода значений массива на экран
  18.     {
  19.         if (mode == 0) //вывод неотсортированного массива
  20.         {
  21.             cout << endl << "Unsorted array:" << endl;
  22.             for (int i = 0; i < n; i++)
  23.             {
  24.                 cout << a[i] << " ";
  25.             }
  26.             cout << endl; ///
  27.         }
  28.         else //вывод отсортированного массива
  29.         {
  30.             cout << endl << "Sorted array:" << endl;
  31.             for (int i = 0; i < n; i++)
  32.             {
  33.                 cout << a[i] << " "; ///
  34.             }
  35.         }
  36.     }
  37.     double bubblesort(int n, int *a) //метод для сортировки "пузырьком"
  38.     {
  39.         clock_t t1 = clock(); //фиксируем время до сортировки
  40.         for (int i = n - 1; i >= 0; i--) //цикл для исключения отсортированных элементов
  41.             for (int j = 0; j < i; j++) //цикл для прогонки элементов
  42.                 if (a[j] > a[j + 1]) //если порядок соседних элементов неправильный,
  43.                     swap(a[j], a[j + 1]); //меняем их местами
  44.         clock_t t2 = clock(); //фиксируем время после сортировки
  45.         double sorttime = t2 - t1; //разницу во времени передаем в переменную
  46.         return sorttime; //и возвращаем это значение в функцию
  47.     }
  48.     double shellsort(int n, int *a) //метод для сортировки Шелла
  49.     {
  50.         clock_t t1 = clock(); //фиксируем время до сортировки
  51.         int step = n / 2; //инициализируем шаг
  52.         while (step > 0)//пока шаг не 0
  53.         {
  54.             for (int i = 0; i < (n - step); i++) //будем идти начиная с i-го элемента
  55.             {
  56.                 int j = i;
  57.                 while (j >= 0 && a[j] > a[j + step]) //пока не пришли к началу массива, и пока рассматриваемый элемент больше чем элемент находящийся на расстоянии шага
  58.                 {
  59.                     swap(a[j], a[j + step]); //меняем их местами
  60.                     j--;
  61.                 }
  62.             }
  63.             step = step / 2; //уменьшаем шаг
  64.         }
  65.         clock_t t2 = clock(); //фиксируем время после сортировки
  66.         double sorttime = t2 - t1; //разницу во времени передаем в переменную
  67.         return sorttime; //и возвращаем это значение в функцию
  68.     };
  69.     double quicksort(int *a, int left, int right) //метод для быстрой сортировки
  70.     {
  71.         clock_t t1 = clock(); //фиксируем время до сортировки
  72.         int i = left, j = right; int center = a[left + (right - left) / 2]; //объявляем локальные переменные, необходимые для сортировки
  73.         while (i <= j) //пока левый маркер не зашел за правый
  74.         {
  75.             while (a[i] < center) i++; //пока значение элемента под левым маркером меньше значения середины, сдвигаем маркер вправо
  76.             while (a[j] > center) j--; //и пока значение элемента под правым маркером больше значения середины, сдвигаем маркер влево
  77.  
  78.             if (i <= j) //если левый маркер меньше либо равен правому
  79.             {
  80.                 swap(a[i], a[j]); //меняем значение элементов под маркерами местами
  81.                 i++; j--; //и смещаем маркеры к центру на 1
  82.             }
  83.         }
  84.         if (i < right) quicksort(a, i, right); //если левый маркер левее конца массива, рекурсивно сортируем отрезок между ними
  85.         if (left < j) quicksort(a, left, j); //если начало массива левее правого маркера, рекурсивно сортируем отрезок между ними
  86.         clock_t t2 = clock(); //фиксируем время после сортировки
  87.         double sorttime = t2 - t1; //разницу во времени передаем в переменную
  88.         return sorttime; //и возвращаем это значение в функцию
  89.     }
  90. };
  91. void main()
  92. {
  93.     Array A;
  94.     int n; cout << "Array size: "; cin >> n; //считываем размер массива
  95.     int type;
  96.     int *a = new int[n]; //объявляем массив заданного размера
  97.     A.fill(n, a); //вызываем функцию для заполнения массива случайными числами
  98.     A.print(n, a, 0); //вызываем функцию для вывода неотсортированного массива на экран
  99.     cout << endl << "Choose sorting type (options:" << endl << "1 - bubble sort, 2 - Shell sort, 3 - quicksort): "; cin >> type;
  100.  
  101.     switch (type) //выбираем вид сортировки
  102.     {
  103.     case 1: //сортировка "пузырьком"
  104.     {
  105.         A.bubblesort(n, a); //вызываем метод для сортировки
  106.         A.print(n, a, 1); //вызываем метод для вывода массива на экран
  107.         cout << "\n\nBubble Sorting time in milliseconds: " << A.bubblesort(n, a);// / CLOCKS_PER_SEC; //выводим время сортировки в секундах
  108.         break;
  109.     }
  110.     case 2: //сортировка Шелла
  111.     {
  112.         A.shellsort(n, a); //вызываем метод для сортировки
  113.         A.print(n, a, 1); //вызываем метод для вывода массива на экран
  114.         cout << "\n\nShellSorting time in milliseconds: " << A.shellsort(n, a);// / CLOCKS_PER_SEC; //выводим время сортировки в секундах
  115.         break;
  116.     }
  117.     case 3: //быстрая сортировка
  118.     {
  119.         A.quicksort(a, 0, n-1); //вызываем метод для сортировки
  120.         A.print(n, a, 1); //вызываем метод для вывода массива на экран
  121.         cout << "\n\nQuick Sorting time in milliseconds: " << A.quicksort(a, 0, n-1);// / CLOCKS_PER_SEC; //выводим время сортировки в секундах
  122.         break;
  123.     }
  124.     default:
  125.         cout << "\nError: wrong type has been chosen.";
  126.         break;
  127.     }
  128.     delete[]a; //очистка памяти
  129.     _getch(); //задержка экрана
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement