Advertisement
smatskevich

PocketSort

Apr 8th, 2017
315
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.34 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4. using std::vector;
  5.  
  6. // Карманная сортировка по последней цифре.
  7. void PocketSort( vector<long long>& arr )
  8. {
  9.     int n = arr.size();
  10.     if( n <= 1 ) {
  11.         return;
  12.     }
  13.     int k = 10;
  14.     // Количества элементов в каждом кармане.
  15.     vector<int> pockets( k, 0 );
  16.     for( int i = 0; i < n; ++i ) {
  17.         ++pockets[arr[i] % 10];
  18.     }
  19.     // Преобразуем в координаты концов карманов + 1.
  20.     // Что то же самое, что начала следующих карманов. pockets[0] не трогаем.
  21.     for( int i = 1; i < k; ++i ) {
  22.         pockets[i] += pockets[i - 1];
  23.     }
  24.    
  25.     // Перемещаем элементы в результирующий массив с карманами.
  26.     vector<long long> result( n );
  27.     for( int i = n - 1; i >= 0; --i ) {
  28.         int targetIndex = --pockets[arr[i] % 10];
  29.         result[targetIndex] = arr[i];
  30.     }
  31.  
  32.     // Меняем местами. Старый удалится в деструкторе result.
  33.     std::swap( arr, result );
  34. }
  35.  
  36. int main()
  37. {
  38.     int n = 0;
  39.     std::cin >> n;
  40.     vector<long long> arr( n, 0 );
  41.     for( int i = 0; i < n; ++i ) {
  42.         std::cin >> arr[i];
  43.     }
  44.  
  45.     PocketSort( arr );
  46.  
  47.     for( int i = 0; i < n; ++i ) {
  48.         std::cout << arr[i] << " ";
  49.     }
  50.     return 0;
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement