Advertisement
Danvil

Сортровка Шелла

May 25th, 2016
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.92 KB | None | 0 0
  1. #include <iostream>
  2. #include "ShellSort.h"
  3. #include "ShellKnut.h"
  4. #include "ShellSejSort.h"
  5. using namespace std;
  6.  
  7. void SetArray(int *arr,int Size, int Range) {
  8. for (int i = 0; i < Size; i++)
  9.     arr[i] = rand() % Range;
  10. }
  11.  
  12. void CopyArray(int *arr1, int *arr2, int Size) {
  13.     for (int i = 0; i < Size; i++)
  14.     arr2[i] = arr1[i];
  15. }
  16.  
  17. int main() {
  18. int Size;
  19. int Range = 10;
  20. setlocale(LC_ALL, "rus");
  21. cout << "Введите размер массива: ";
  22. cin >> Size;
  23. cout << endl;
  24. int *arr1 = new int[Size];
  25. int *arr2 = new int[Size];
  26. int *arr3 = new int[Size];
  27. int *arr4 = new int[Size];
  28. int *arr5 = new int[Size];
  29.  
  30. SetArray(arr1,Size,Range);
  31. CopyArray(arr1,arr2,Size);
  32. CopyArray(arr1,arr3,Size);
  33. CopyArray(arr1,arr4,Size);
  34. CopyArray(arr1,arr5,Size);
  35.  
  36. cout << "Полученный массив :" << endl;
  37. for (int i = 0; i < Size; i++)
  38.     cout << arr1[i] << " ";
  39. cout << endl;
  40.  
  41. cout << "+++++++++++++++++++++++++++++++++++++++++++++++" << endl;
  42. shellSort(arr2,Size);
  43. cout << "+++++++++++++++++++++++++++++++++++++++++++++++" << endl;
  44. ShellKnutSort(arr3,Size);
  45. cout << "+++++++++++++++++++++++++++++++++++++++++++++++" << endl;
  46. ShellSejSort(arr4,Size);
  47. cout << "+++++++++++++++++++++++++++++++++++++++++++++++" << endl;
  48. system("pause");
  49. }
  50. //////////////////////
  51. #include <iostream>
  52. using namespace std;
  53. int StepSej(int *step, int n) {
  54.     int s;
  55.     int p1, p2, p3;
  56.     p1 = 1;
  57.     p2 = 1;
  58.     p3 = 1;
  59.     s = -1;
  60.     do {
  61.         if (++s % 2) {
  62.             step[s] = 8 * p1 - 6 * p2 + 1; }
  63.         else {
  64.             step[s] = 9 * p1 - 9 * p3 + 1;
  65.             p2 *= 2;
  66.             p3 *= 2;
  67.         }
  68.         p1 *= 2;
  69.     }
  70.     while (3 * step[s] < n);
  71.     return((s > 0) ? (--s) : (0));
  72. }
  73. template <typename t>
  74. void ShellSejSort(t *arr, int length) {
  75.     int step;
  76.     int j,s;
  77.     int stepS[50];
  78.     int compare = 0;
  79.     int swap = 0;
  80.     s = StepSej(stepS, length);
  81.     while (s >= 0) {
  82.         step = stepS[s--];
  83.         for (int i = step; i < length; i++) {
  84.             t temp = arr[i];
  85.             compare++;
  86.             for (j = i - step, compare++; (j >= 0) && (arr[j] > temp); j -= step) {
  87.                 arr[j + step] = arr[j];
  88.                 swap++;
  89.             }
  90.             arr[j + step] = temp;
  91.             swap++;
  92.         }
  93.     }
  94.     cout << "Сортировка Шелла(Сэджвик) :" << endl;
  95. for (int i = 0; i < length; i++)
  96.     cout << arr[i] << " ";
  97. cout <<endl;
  98. cout << "Количество сравнений " << compare << endl << "Количество перестановок " << swap << endl;
  99. }
  100. ///////////////////////
  101. template <typename t>
  102.  
  103. void ShellKnutSort(t *arr, int length){
  104.  int compare = 0;
  105.  int swap = 0;
  106.  int size = length;
  107.  int Step = 1;
  108.  while (Step < size / 3)
  109.      Step = 3 * Step + 1;
  110.  while (Step >= 1) {
  111.      for (int i = Step; i < size; i++) {
  112.          t temp = arr[i];
  113.          int j = i - Step;
  114.          while (j >= 0 && (temp < arr[j])) {
  115.              compare++;
  116.              arr[j + Step] = arr[j];
  117.              j -= Step;
  118.              swap++;  }
  119.          arr[j + Step] = temp;
  120.          swap++;
  121.      }
  122.      Step /= 3;
  123.  }
  124.  cout << "Сортировка Шелла(Кнут) :" << endl;
  125.  for (int i = 0; i < length; i++)
  126.     cout << arr[i] << " ";
  127.  cout <<endl;
  128.  cout << "Количество сравнений " << compare << endl << "Количество перестановок " << swap << endl;
  129. }
  130. ///////////////////////
  131. template <typename t>
  132. void shellSort(t *arr, size_t length) {
  133. t temp;
  134. int compare = 0; //количество сравнений
  135. int swap = 0; //количество сдвигов
  136. size_t i, j, k;
  137. for (k = length / 2; k > 0; k /= 2) {
  138.     for (i = k; i < length; i++)
  139.     {
  140.         temp = arr[i];
  141.         for (j = i; j >= k; j -= k) {
  142.             compare++;
  143.             if (temp < arr[j - k]) {
  144.                 arr[j] = arr[j - k];
  145.                 swap++;
  146.             }
  147.             else
  148.                 break;
  149.         }
  150.         arr[j] = temp;
  151.     }
  152. }
  153. cout << "Сортировка Шелла :" << endl;
  154. for (i = 0; i < length; i++)
  155.     cout << arr[i] << " ";
  156. cout <<endl;
  157. cout << "Количество сравнений " << compare << endl << "Количество перестановок " << swap << endl;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement