Neon_Falcon

Untitled

May 14th, 2019
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.58 KB | None | 0 0
  1. #include <math.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5. #include <locale.h>
  6.  
  7. int selectionSort(int *arr, int size) /// Функция сортировки прямым выбором
  8. {
  9. int min, temp; // для поиска минимального элемента и для обмена
  10. for (int i = 0; i < size - 1; i++)
  11. {
  12. min = i; // запоминаем индекс текущего элемента
  13. // ищем минимальный элемент чтобы поместить на место i-ого
  14. for (int j = i + 1; j < size; j++) // для остальных элементов после i-ого
  15. {
  16. if (arr[j] < arr[min]) // если элемент меньше минимального,
  17. min = j; // запоминаем его индекс в min
  18. }
  19. temp = arr[i]; // меняем местами i-ый и минимальный элементы
  20. arr[i] = arr[min];
  21. arr[min] = temp; }
  22. return *arr;
  23. }
  24.  
  25.  
  26.  
  27. void mergeSort(int *a, int l, int r)
  28. {
  29. if (l == r) return; // границы сошлись
  30. int mid = (l + r) / 2; // определяем середину последовательности
  31. // и рекурсивно вызываем функцию сортировки для каждой половины
  32. mergeSort(a, l, mid);
  33. mergeSort(a, mid + 1, r);
  34.  
  35. int i = l; // начало первого пути
  36. int j = mid + 1; // начало второго пути
  37. int *tmp = (int*)malloc(r * sizeof(int)); // дополнительный массив
  38. for (int step = 0; step < r - l + 1; step++) // для всех элементов дополнительного массива
  39. {
  40. // записываем в формируемую последовательность меньший из элементов двух путей
  41. // или остаток первого пути если j > r
  42. if ((j > r) || ((i <= mid) && (a[i] < a[j])))
  43. {
  44. tmp[step] = a[i];
  45. i++;
  46. }
  47. else
  48. {
  49. tmp[step] = a[j];
  50. j++;
  51. }
  52. }
  53. // переписываем сформированную последовательность в исходный массив
  54. for (int step = 0; step < r - l + 1; step++)
  55. a[l + step] = tmp[step];
  56. free(tmp);
  57. }
  58.  
  59. int main() {
  60. float start1, start2, stop1, stop2;
  61. int *arr, *arr1, size;
  62. scanf("%d", &size);
  63. setlocale(LC_ALL, "Rus");
  64.  
  65. arr = (int*)calloc(size, sizeof(int));
  66. srand(time(NULL));
  67. for (int i = 0; i < size; i++) {
  68. arr[i] = -50 + rand() % (101);
  69. printf("%d ", arr[i]);
  70. }
  71. arr1 = (int*)calloc(size, sizeof(int));
  72. printf("\n");
  73. for (int i = 0; i < size; i++) {
  74. arr1[i] = arr[i];
  75. }
  76. start1 = clock();
  77. selectionSort(arr, size);
  78. stop1 = clock();
  79. for (int i = 0; i < size; i++)
  80. {
  81. printf("%d ", arr[i]);
  82. }
  83. printf("\n");
  84. start2 = clock();
  85. mergeSort(arr1, 0, size - 1); // вызываем функцию сортировки
  86. stop2 = clock();
  87. for (int i = 0; i < size; i++)
  88. {
  89. printf("%d ", arr1[i]);
  90. }
  91.  
  92. printf("\n Время сортировки прямым выбором : %f\n", (stop1 - start1) / CLOCKS_PER_SEC);
  93. printf("\n Время сортировки слиянием: %f\n", (stop2 - start2) / CLOCKS_PER_SEC);
  94.  
  95. getchar();
  96. getchar();
  97. free(arr);
  98. }
Advertisement
Add Comment
Please, Sign In to add comment