Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- union RadixUnion {
- unsigned int num;
- unsigned char set[4];
- };
- // Функция цифровой/поразрядной сортировки по основанию 256, сложность алгоритма всегда O(n * k),
- // где k - это максимальное количество цифр элементов массива.
- // Затраты по памяти - O(n + k).
- // Это сортировка является устойчивой. В худшем, среднем и лучшем случаях алгоритм имеет сложность O(n * k),
- // что не может не радовать.
- void radixSort(int* numbers, int array_size)
- {
- int digit = 0;
- RadixUnion* temp = new RadixUnion[array_size];
- while (digit < 4) {
- for (int i = 0; i < array_size; i++)
- temp[i].num = (unsigned int)numbers[i];
- int* c = new int[256];
- for (int i = 0; i < 256; i++)
- c[i] = 0;
- for (int i = 0; i < array_size; i++)
- c[temp[i].set[digit]]++;
- for (int i = 1; i < 256; i++)
- c[i] += c[i - 1];
- for (int i = array_size - 1; i >= 0; --i)
- {
- c[temp[i].set[digit]]--;
- numbers[c[temp[i].set[digit]]] = temp[i].num;
- }
- digit++;
- delete[] c;
- }
- delete[] temp;
- }
- int main()
- {
- int n, k, x;
- std::cin >> k >> n;
- int* arr = new int[n];
- for (int i = 0; i < n; ++i)
- {
- std::cin >> x;
- arr[i] = x;
- }
- radixSort(arr, n);
- for (int i = n - 1; i >= n - k; --i)
- std::cout << arr[i] << " ";
- delete[] arr;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement