Advertisement
Guest User

Untitled

a guest
Feb 25th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. const int bitesInByte = 8;
  5.  
  6. int pow2(int exp) {
  7. int answer = 2;
  8. --exp;
  9. while(exp > 0) {
  10. answer *= 2;
  11. --exp;
  12. }
  13. return answer;
  14. }
  15.  
  16. int getRCategoryValue (int64_t value ,int rCategory ){
  17. while(rCategory > 0){
  18. value /= pow2(bitesInByte);
  19. --rCategory;
  20. }
  21. return value % pow2(bitesInByte);
  22. }
  23.  
  24. template<class Iterator>
  25. void countingSort(Iterator begin, Iterator end, int rCategory){
  26. int maxValueInByte = pow2(bitesInByte); //(2^8 чисел в байте)
  27. std::vector<int> countingArray(maxValueInByte, 0);
  28. for (Iterator it = begin; it !=end; ++it){
  29. countingArray[getRCategoryValue(*it, rCategory)]++ ;
  30. }
  31. int sum = 0;
  32. for(int i = 0; i< countingArray.size(); ++i){
  33. int temp = countingArray[i];
  34. countingArray[i] = sum;
  35. sum += temp;
  36. }
  37. std::vector<int64_t> resultArray(end - begin);// как взять тип?
  38. for(Iterator it = begin; it != end; ++it){
  39. resultArray[countingArray[getRCategoryValue(*it, rCategory)]++]= *it;
  40. }
  41. Iterator start = begin;
  42. for(int i = 0; i < resultArray.size(); ++i){
  43. *start = resultArray[i];
  44. ++start;
  45. }
  46. }
  47.  
  48. template <class Iterator>
  49. void myPrint(Iterator begin, Iterator end){
  50. for (Iterator it = begin; it != end; ++it){
  51. std::cout << *it << ' ';
  52. }
  53. std::cout << '\n';
  54. }
  55.  
  56. template <class Iterator>
  57. void LSD(Iterator begin, Iterator end){
  58. for (int rCategory = 0; rCategory < sizeof(int64_t); ++rCategory){
  59. countingSort(begin, end, rCategory);
  60. //myPrint(begin, end);
  61. }
  62. }
  63.  
  64. int main(){
  65. int n;
  66. int64_t temp;
  67. std::cin >> n;
  68. std::vector<int64_t> values;
  69. for( int i = 0; i < n; ++i){
  70. std::cin >> temp;
  71. values.push_back(temp);
  72. }
  73.  
  74. LSD(values.begin(), values.end());
  75.  
  76. myPrint(values.begin(), values.end());
  77. return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement