Guest User

Untitled

a guest
Jul 18th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.23 KB | None | 0 0
  1. //Слияние двух расположенных рядом друг с другом частей массива
  2. void merge(int *A, int *B, int l, int m, int r)
  3. //A - сортируемый массив, B - буфер для слияния, l - первый элемент первой части, r - последний элемент второй части, m - последний элемент первой части
  4. {
  5. int i=l;
  6. int j = m+1;
  7. int k=l;
  8. //Вставлять минимальные элементы в B пока не кончится одна из последовательностей
  9. while (( i<=m) && (j<= r))
  10. {
  11. if (A[i] {
  12. B[k] = A[i];
  13. i++;
  14. } else {
  15. B[k] = A[j];
  16. j++;
  17. }
  18. k++;
  19. }
  20. //Скопировать остаток, если таковой имеется
  21. while (i < = m)
  22. {
  23. B[k]=A[i];
  24. k++;
  25. i++;
  26. }
  27. while (j < = r)
  28. {
  29. B[k]=A[j];
  30. k++;
  31. j++;
  32. }
  33. //Отсортированная часть остаётся в B
  34. }
  35.  
  36. //Сортировка слиянием, без рекурсии
  37. void nrmsort(int* A, int* B, int l, int r)
  38. //A - сортируемый массив, B - буфер для слияния, l - левая граница сортируемого участка, r - правая граница
  39. {
  40. int p=2;
  41. int m;
  42. int i;
  43. int r2;
  44. int N = r-l+1;
  45. int *tA = A;
  46. int *tB = B;
  47. int *t = NULL;
  48.  
  49. while(p<(2*N))
  50. {
  51. for(i=l;i<=r;i+=p)
  52. {
  53. r2 = min(i+p-1,r);
  54. m = min(r,((i+i+p-1) >> 1));
  55. merge(tA,tB,i,m,r2);
  56. }
  57. p *= 2; //Вдвое увеличим размер сливаемых частей
  58. t = tA; //Поменяем сортируемый массив и буфер местами
  59. tA = tB;
  60. tB = t;
  61. t = NULL;
  62. }
  63. if (tA != A)
  64. {
  65. //Переписать элементы в исходный массив А
  66. for (int k = l; k<= r; k++)
  67. {
  68. A[k] = B[k];
  69. }
  70. }
  71. }
  72.  
  73. //Сортировка слиянием, распараллеленная
  74. void mp_sort(int* A, int* B, int N, int P)
  75. //A - сортируемый массив, B - буфер для слияния, N - размер массива, P - число параллельно выполняемых потоков
  76.  
  77. {
  78. int *tA = A;
  79. int *tB
Add Comment
Please, Sign In to add comment