Advertisement
AmidamaruZXC

Untitled

Dec 1st, 2020
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3.  
  4. union RadixUnion {
  5.     unsigned int num;
  6.     unsigned char set[4];
  7. };
  8.  
  9. // Функция цифровой/поразрядной сортировки по основанию 256, сложность алгоритма всегда O(n * k),
  10. // где k - это максимальное количество цифр элементов массива.
  11. // Затраты по памяти - O(n + k).
  12. // Это сортировка является устойчивой. В худшем, среднем и лучшем случаях алгоритм имеет сложность O(n * k),
  13. // что не может не радовать.
  14. void radixSort(int* numbers, int array_size)
  15. {
  16.     int digit = 0;
  17.     RadixUnion* temp = new RadixUnion[array_size];
  18.  
  19.     while (digit < 4) {
  20.         for (int i = 0; i < array_size; i++)
  21.             temp[i].num = (unsigned int)numbers[i];
  22.  
  23.         int* c = new int[256];
  24.  
  25.         for (int i = 0; i < 256; i++)
  26.             c[i] = 0;
  27.  
  28.         for (int i = 0; i < array_size; i++)
  29.             c[temp[i].set[digit]]++;
  30.  
  31.         for (int i = 1; i < 256; i++)
  32.             c[i] += c[i - 1];
  33.  
  34.         for (int i = array_size - 1; i >= 0; --i)
  35.         {
  36.             c[temp[i].set[digit]]--;
  37.             numbers[c[temp[i].set[digit]]] = temp[i].num;
  38.         }
  39.  
  40.         digit++;
  41.         delete[] c;
  42.     }
  43.  
  44.     delete[] temp;
  45. }
  46.  
  47. int main()
  48. {
  49.     int n, k, x;
  50.     std::cin >> k >> n;
  51.     int* arr = new int[n];
  52.     for (int i = 0; i < n; ++i)
  53.     {
  54.         std::cin >> x;
  55.         arr[i] = x;
  56.     }
  57.  
  58.     radixSort(arr, n);
  59.     for (int i = n - 1; i >= n - k; --i)
  60.         std::cout << arr[i] << " ";
  61.  
  62.     delete[] arr;
  63.     return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement