Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.12 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using std::cin;
  4. using std::cout;
  5. using std::endl;
  6. unsigned long long pow(int a, int k) {
  7. if (k == 0)
  8. return 1;
  9. if (k % 2 == 1)
  10. return pow (a, k-1) * a;
  11. else {
  12. unsigned long long res = pow (a, k/2);
  13. return res * res;
  14. }
  15. }
  16.  
  17. short kBit(unsigned long long a, int k) {
  18. unsigned long long u = pow(2, k);
  19. if ((a & u) == u)
  20. return 1;
  21. else return 0;
  22. }
  23. void MSDSort(long long * a, int l, int r, int k) {
  24. auto *b = new long long[r - l]; //перестановка на отрезке
  25. int *c = new int[2]; //массив для сортировки подсчетом
  26. for (int i = 0; i < 2; i++)
  27. c[i] = 0; //обнуляем значения
  28.  
  29. for (int i = l; i < r; i++) {
  30. c[kBit(a[i], k)]++; //считаем биты
  31. }
  32.  
  33. int* indexes = new int[2]; //массив для индексации
  34. for (int i = 0; i < 2; i++) {
  35. indexes[i] = c[i];
  36. }
  37.  
  38. int count = 0; //количество элементов которые находяться до iого элемента
  39. for (int i = 0; i < 2; i++) {
  40. int t = indexes[i];
  41. indexes[i] = count;
  42. count += t; //увеличили счетчик
  43. }
  44.  
  45. for (int i = l; i < r; i++) { //перестановка элементов
  46. int bit = kBit(a[i], k);
  47. b[indexes[bit]] = a[i];
  48. indexes[bit]++;
  49. }
  50. for (int i = l; i < r; i++)
  51. a[i] = b[i - l];
  52.  
  53. delete []b;
  54.  
  55. if (k > 0) {
  56. if (c[0] > 0)
  57. MSDSort(a,l, l + c[0], k - 1);
  58. if (c[1] - 1 > 0)
  59. MSDSort(a,l + c[0], l + c[0] + c[1], k - 1);
  60. }
  61. delete []c;
  62. delete []indexes;
  63. }
  64. int main() {
  65. int n;
  66. cin>>n;
  67. auto *a = new long long[n];
  68. long long max = 0;
  69. for (int i = 0; i < n; i++) {
  70. cin >> a[i];
  71. if (a[i] > max)
  72. max = a[i];
  73. }
  74. int k = 0;
  75. while (max != 0){
  76. max /= 2;
  77. k++;
  78. }
  79. MSDSort(a,0,n,k);
  80. for (int i = 0; i < n; i++)
  81. cout<<a[i]<<" ";
  82. return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement