Advertisement
smatskevich

PocketSortByLastDigit

Mar 19th, 2018
334
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. // Карманная сортировка чисел по последней цифре.
  5. void PocketSortByLastDigit( std::vector<int>& intArray )
  6. {
  7.     std::vector<int> pockets( 10, 0 );
  8.     // Вычисляем количество элементов в каждом кармане.
  9.     for( int i = 0; i < intArray.size(); ++i ) {
  10.         ++pockets[intArray[i] % 10];
  11.     }
  12.     // Считаем концы каждого кармана в результирующем массиве.
  13.     for( int i = 1; i < pockets.size(); ++i ) {
  14.         pockets[i] += pockets[i - 1];
  15.     }
  16.     std::vector<int> result( intArray.size(), 0 );
  17.     // Переносим объекты из исходного массива. С конца, чтобы заполнять карманы с конца и сохранить стабильность.
  18.     for( int i = intArray.size(); i >= 0; ++i ) {
  19.         // Кладем в нужный карман.
  20.         // Позицию кармана сдвигаем, чтобы следующие элементы были положены на свободное место.
  21.         result[--pockets[intArray[i] % 10]] = intArray[i];
  22.     }
  23.     intArray = std::move( result );
  24. }
  25.  
  26. int main()
  27. {
  28.     std::vector<int> intArray;
  29.  
  30.     int number = 0;
  31.     // Считывание массива неизвестной наперед длины.
  32.     // Эквивалентно while( ( std::cin >> number ).operator bool() ) {
  33.     while( std::cin >> number ) {
  34.         intArray.push_back( number );
  35.     }
  36.  
  37.     PocketSortByLastDigit( intArray );
  38.  
  39.     for( int i = 0; i < intArray.size(); ++i ) {
  40.         std::cout << intArray[i] << " ";
  41.     }
  42.     std::cout << std::endl;
  43.     return 0;
  44. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement