Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "bits/stdc++.h"
- using namespace std;
- struct Queue{
- unsigned long long N_op = 0;
- Queue(long long size = 1) : length(size), arr(new long long[size]), begin(0), count(0), end(-1) {
- N_op += 7;
- }
- ~Queue() {
- delete []arr;
- N_op++;
- }
- void push(long long value) {
- if (isFull())
- resize(length * 2);
- ++end %= length;
- arr[end] = value;
- count++;
- N_op += 8;
- }
- void pop() {
- if(!isEmpty()){
- arr[begin] = INT_MIN;
- ++begin%=length;
- count--;
- } else {
- cout << "queue is empty!";
- }
- N_op += 8;
- }
- long long front() {
- N_op += 5;
- if(!isEmpty())
- return arr[begin];
- else
- cout << "queue is empty!";
- }
- void resize(long long new_size) {
- long long* arr2 = arr;
- arr = new long long[new_size];
- for(int i = 0; i < length; ++i) {
- arr[i] = arr2[(i + begin) % length];
- }
- begin = 0;
- end = length - 1;
- length = new_size;
- delete []arr2;
- N_op += 4 * length + 13;
- }
- bool isEmpty() {
- N_op += 2;
- return size() == 0;
- }
- bool isFull() {
- N_op += 2;
- return size() == count;
- }
- long long size() {
- N_op++;
- return length;
- }
- void print() {
- for(long long i = begin; i < begin + count; ++i)
- cout << arr[i % length] << ' ';
- cout << endl;
- }
- private:
- long long *arr;
- long long length;
- long long begin;
- long long end;
- long long count;
- };
- void sort(Queue& q) {
- q.N_op += 3;
- for(long long i = 0; i < q.size(); ++i){
- q.N_op += 12;
- long long mn = INT32_MAX, first = 0, temp = 0;
- bool swap = true;
- for(int j = 0; j < i; ++j){
- q.N_op++;
- temp = q.front();
- q.pop();
- q.push(temp);
- }
- first = q.front();
- for(long long j = i; j < q.size(); ++j){
- temp = q.front();
- mn = min(q.front(), mn);
- q.pop();
- q.push(temp);
- q.N_op += 3;
- }
- for (long long j = 0; j < i; ++j){
- q.N_op++;
- temp = q.front();
- q.pop();
- q.push(temp);
- }
- for(long long j = i; j < q.size(); ++j){
- q.N_op += 5;
- temp = q.front();
- q.pop();
- if(temp == mn && swap) {
- q.push(first);
- swap = false;
- }
- else if (i == j) {
- q.push(mn);
- }
- else
- q.push(temp);
- }
- }
- }
- int main() {
- for (long long a = 500; a <= 1000; a += 50) {
- Queue queue;
- srand(time(0));
- ::clock_t start = ::clock();
- for(int i = 0; i < a; ++i)
- queue.push(::rand() % (5 * a));
- cout << "init of " << a << " elements takes " << (::clock() - start) * 1000 / CLOCKS_PER_SEC << " millisec\n";
- start = ::clock();
- sort(queue);
- cout << "sort of " << a << " elements takes " << (::clock() - start) * 1000 / CLOCKS_PER_SEC << " millisec\n";
- cout << "takes " << queue.N_op << " N_op\n\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement