#include <iostream>
#include <iomanip>
#include <algorithm>
#include <windows.h>

using namespace std;

class StopWatch {
public:
    StopWatch();
    void start();
    void stop();
private:
    bool running;
    double f;
    long long start_time;
    long long total_time;
    long long getExecutionTime() const;
    void printError() const;
friend ostream& operator<<(ostream& o, const StopWatch& sw);
};

StopWatch::StopWatch(): running(false), total_time(0) {
    LARGE_INTEGER performanceFrequency;
    if (QueryPerformanceFrequency(&performanceFrequency) == 0) {
        printError();
    }
    f = double(performanceFrequency.QuadPart);
}

void StopWatch::start() {
    if (!running) {
        running = true;
        start_time = getExecutionTime();
    }
}

void StopWatch::stop() {
    if (running) {
        running = false;
        total_time = getExecutionTime() - start_time;
    }
}

long long StopWatch::getExecutionTime() const {
    LARGE_INTEGER performanceCount;
    if (QueryPerformanceCounter(&performanceCount) == 0) {
        printError();
    }
    return performanceCount.QuadPart;
}

void StopWatch::printError() const {
    LPTSTR lpMsgBuf = 0;
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        GetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        lpMsgBuf,
        0,
        NULL
    );
    cerr << lpMsgBuf << endl;
    LocalFree(lpMsgBuf);
}

ostream& operator<<(ostream& o, const StopWatch& sw) {
    long long res = sw.running ? sw.getExecutionTime() - sw.start_time : sw.total_time;
    return o << fixed << setprecision(2) << res / sw.f << " sec";
}

void bubble_sort(int* begin, int* end) {
    for (int* p = end - 1; p != begin; --p) {
        for (int* q = begin; q != p; ++q) {
            if (*q > *(q + 1)) {
                int t = *q;
                *q = *(q + 1);
                *(q + 1) = t;
            }
        }
    }
}

int main() {
    srand(static_cast<unsigned int>(time(0)));
    int n;
    do {
        cout << "Geef N (<=0 om te stoppen): ";
        cin >> n;
        if (n > 0) {
            int* array = new int[n];
            for (int i = 0; i < n; ++i) {
                array[i] = rand();
            }
            StopWatch sw;
            sw.start();
            bubble_sort(array, array + n);
            //sort(array, array + n);
            sw.stop();
            cout << "Tijdsduur: " << sw << endl;
            delete[] array;
        }
    } while (n > 0);
}
