HasanRasulov

SortTask

Apr 7th, 2024 (edited)
392
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.27 KB | Source Code | 0 0
  1. #include <algorithm>
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <vector>
  6. #include <iterator>
  7. #include <random>
  8.  
  9. enum class  DIR{ASCENDING,DESCENDING};
  10. std::random_device device{};
  11. std::mt19937 g(device());
  12. std::uniform_int_distribution<> distrib(1, 2);
  13.    
  14.  
  15. void heapify(std::vector<int>& data, size_t n, size_t i) {
  16.     size_t min{i};
  17.     size_t left{2 * i + 1};
  18.     size_t right {2 * i + 2};
  19.  
  20.  
  21.     if (left < n && data[left] <data[min])
  22.         min = left;
  23.  
  24.     if (right < n && data[right] < data[min])
  25.         min = right;
  26.    
  27.  
  28.     if (min != i) {
  29.         std::swap(data[i], data[min]);
  30.  
  31.         heapify(data,n, min);
  32.     }
  33. }
  34.  
  35. std::vector<int> heapSort(std::vector<int>& data,DIR direction) {
  36.    
  37.     std::vector<int> res;
  38.     res.reserve(data.size());
  39.  
  40.     for (int i = data.size() / 2 - 1; i >= 0; i--)
  41.         heapify(data,data.size(), i);
  42.  
  43.     for (int i = data.size() - 1; i >= 0; i--) {
  44.        
  45.         res.push_back(data[0]);
  46.         std::swap(data[0],data[i]);
  47.  
  48.         heapify(data, i,0);
  49.     }
  50.     return direction==DIR::ASCENDING ?  res : data;
  51. }
  52.  
  53. template<typename T>
  54. void merge( std::vector<T>& data,size_t leftIdx, size_t mid,size_t rightIdx){
  55.    
  56.     size_t leftSize = mid-leftIdx +1;
  57.     size_t rightSize = rightIdx - mid;
  58.    
  59.     std::vector<T> left,right;
  60.     std::copy_n(data.begin()+leftIdx, leftSize, std::back_inserter(left));
  61.     std::copy_n(data.begin()+mid+1, rightSize, std::back_inserter(right));
  62.    
  63.     size_t i{}, j{};  
  64.     size_t k = leftIdx;  
  65.    
  66.     while (i<leftSize && j<rightSize){  
  67.         data[k++] = left[i] <= right[j] ? left[i++]: right[j++];
  68.     }  
  69.    
  70.     std::copy(left.begin()+i, left.end(),data.begin()+k);
  71.     std::copy(right.begin()+j, right.end(),data.begin()+k);
  72.    
  73. }
  74.  
  75. template<typename T>
  76. void mergeSort( std::vector<T>& data,size_t left, size_t right){
  77.    
  78.     if(right>left){
  79.         size_t mid  = left + (right-left)/2;
  80.         mergeSort(data,left,mid);
  81.         mergeSort(data,mid+1,right);
  82.         merge(data,left,mid,right);
  83.        
  84.     }
  85.    
  86. }
  87. int choosePivot(std::vector<int>& data,int left, int right) {
  88.         int middle = left + ( right-left) / 2;
  89.  
  90.         if (data[left] > data[middle])
  91.             std::swap(data[left], data[middle]);
  92.         if (data[left] > data[right])
  93.             std::swap(data[left], data[right]);
  94.         if (data[middle] > data[right])
  95.             std::swap(data[middle], data[right]);
  96.  
  97.         std::swap(data[middle], data[right - 1]);    
  98.         return data[right - 1];    
  99. }
  100.  
  101. size_t partition(std::vector<int>& data, int low, int high,int pivot){
  102.  
  103.     int k{low},z{low};
  104.  
  105.     while( k <= high){
  106.         if(data[k] > pivot) k++;
  107.         else std::swap(data[k++],data[z++]);
  108.     }
  109.     return z-1;
  110. }
  111.  
  112.  
  113. void quickSort(std::vector<int >& data, int low, int high){
  114.    
  115.    
  116.     if(low < high){
  117.         int pivot = choosePivot(data,low,high);        
  118.         size_t pos = partition(data, low, high,pivot);
  119.         quickSort(data, low, pos-1);
  120.         quickSort(data, pos+1, high);
  121.     }
  122. }
  123.  
  124. constexpr size_t N = 1000;
  125. int main() {
  126.      
  127.     std::vector<int> data(N),original,dataCp,dataCp1;
  128.     original.reserve(N);
  129.     dataCp.reserve(N);
  130.     dataCp1.reserve(N);
  131.        
  132.     std::ranges::generate(data,[n=1]()mutable{ return n++;});
  133.     std::ranges::copy(data,std::back_inserter(original));
  134.    
  135.     std::shuffle(data.begin(),data.end(),g);
  136.     std::ranges::copy(data,std::back_inserter(dataCp));
  137.     std::ranges::copy(data,std::back_inserter(dataCp1));
  138.     std::ranges::copy(data, std::ostream_iterator<int>(std::cout, ","));
  139.  
  140.  
  141.     auto res =  heapSort(data,DIR::ASCENDING);
  142.    
  143.     if(std::ranges::equal(original,res))
  144.         std::cout<<"\nHeap Sort is correct\n";
  145.    
  146.     std::shuffle(dataCp.begin(),dataCp.end(),g);
  147.     std::ranges::copy(dataCp, std::ostream_iterator<int>(std::cout, ","));
  148.  
  149.     mergeSort(dataCp,0,dataCp.size()-1);
  150.  
  151.     if(std::ranges::equal(res,dataCp))
  152.         std::cout<<"\nMerge Sort is correct\n";
  153.    
  154.     std::shuffle(dataCp1.begin(),dataCp1.end(),g);
  155.     std::ranges::copy(dataCp1, std::ostream_iterator<int>(std::cout, ","));
  156.  
  157.  
  158.     quickSort(dataCp1,0,dataCp1.size()-1);
  159.  
  160.     if(std::ranges::equal(dataCp1,dataCp))
  161.         std::cout<<"\nQuick Sort is correct\n";
  162.    
  163.     return 0;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment