Advertisement
CyberN00b

m_first

Jan 8th, 2023
655
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.40 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2.  
  3. using namespace std;
  4.  
  5. struct Queue{
  6.  
  7.     unsigned long long N_op = 0;
  8.  
  9.     Queue(long long size = 1) : length(size), arr(new long long[size]), begin(0), count(0), end(-1) {
  10.         N_op += 7;
  11.     }
  12.  
  13.     ~Queue() {
  14.         delete []arr;
  15.         N_op++;
  16.     }
  17.  
  18.     void push(long long value) {
  19.         if (isFull())
  20.             resize(length * 2);
  21.         ++end %= length;
  22.         arr[end] = value;
  23.         count++;
  24.         N_op += 8;
  25.     }
  26.  
  27.     void pop() {
  28.         if(!isEmpty()){
  29.             arr[begin] = INT_MIN;
  30.             ++begin%=length;
  31.             count--;
  32.         } else {
  33.             cout << "queue is empty!";
  34.         }
  35.         N_op += 8;
  36.     }
  37.  
  38.     long long front() {
  39.         N_op += 5;
  40.         if(!isEmpty())
  41.             return arr[begin];
  42.         else
  43.             cout << "queue is empty!";
  44.     }
  45.  
  46.     void resize(long long new_size) {
  47.         long long* arr2 = arr;
  48.         arr = new long long[new_size];
  49.         for(int i = 0; i < length; ++i) {
  50.             arr[i] = arr2[(i + begin) % length];
  51.         }
  52.         begin = 0;
  53.         end = length - 1;
  54.         length = new_size;
  55.         delete []arr2;
  56.         N_op += 4 * length + 13;
  57.     }
  58.  
  59.     bool isEmpty() {
  60.         N_op += 2;
  61.         return size() == 0;
  62.     }
  63.  
  64.     bool isFull() {
  65.         N_op += 2;
  66.         return size() == count;
  67.     }
  68.  
  69.     long long size() {
  70.         N_op++;
  71.         return length;
  72.     }
  73.  
  74.     void print() {
  75.         for(long long i = begin; i < begin + count; ++i)
  76.             cout << arr[i % length] << ' ';
  77.         cout << endl;
  78.     }
  79.  
  80. private:
  81.  
  82.     long long *arr;
  83.     long long length;
  84.     long long begin;
  85.     long long end;
  86.     long long count;
  87.  
  88. };
  89.  
  90.  
  91. void sort(Queue& q) {
  92.     q.N_op += 3;
  93.     for(long long i = 0; i < q.size(); ++i){
  94.         q.N_op += 12;
  95.         long long mn = INT32_MAX, first = 0, temp = 0;
  96.         bool swap = true;
  97.         for(int j = 0; j < i; ++j){
  98.             q.N_op++;
  99.             temp = q.front();
  100.             q.pop();
  101.             q.push(temp);
  102.         }
  103.         first = q.front();
  104.         for(long long j = i; j < q.size(); ++j){
  105.             temp = q.front();
  106.             mn = min(q.front(), mn);
  107.             q.pop();
  108.             q.push(temp);
  109.             q.N_op += 3;
  110.         }
  111.         for (long long j = 0; j < i; ++j){
  112.             q.N_op++;
  113.             temp = q.front();
  114.             q.pop();
  115.             q.push(temp);
  116.         }
  117.         for(long long j = i; j < q.size(); ++j){
  118.             q.N_op += 5;
  119.             temp = q.front();
  120.             q.pop();
  121.             if(temp == mn && swap) {
  122.                 q.push(first);
  123.                 swap = false;
  124.             }
  125.             else if (i == j) {
  126.                 q.push(mn);
  127.             }
  128.             else
  129.                 q.push(temp);
  130.         }
  131.     }
  132. }
  133.  
  134. int main() {
  135.     for (long long a = 500; a <= 1000; a += 50) {
  136.         Queue queue;
  137.         srand(time(0));
  138.         ::clock_t start = ::clock();
  139.         for(int i = 0; i < a; ++i)
  140.             queue.push(::rand() % (5 * a));
  141.         cout << "init of " << a << " elements takes " << (::clock() - start) * 1000 / CLOCKS_PER_SEC << " millisec\n";
  142.         start = ::clock();
  143.         sort(queue);
  144.         cout << "sort of " << a << " elements takes " << (::clock() - start) * 1000 / CLOCKS_PER_SEC << " millisec\n";
  145.         cout << "takes " << queue.N_op << " N_op\n\n";
  146.     }
  147. }
  148.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement