Browse Source

added bubble sort

dagerob 3 years ago
parent
commit
917cd48254
1 changed files with 123 additions and 2 deletions
  1. 123 2
      bubble_sort/Main.cpp

+ 123 - 2
bubble_sort/Main.cpp

@@ -1,6 +1,127 @@
+#include <chrono>
 #include <iostream>
 
+#define MAX_SIZE 1000000
+
+long getNanos() {
+    return std::chrono::high_resolution_clock::now().time_since_epoch().count();
+}
+
+long getMillis() {
+    return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count();
+}
+
+int intKey(const int& i) {
+    return i;
+}
+
+static unsigned long seed = 0;
+
+int randomInt() {
+    seed = (seed * 0x5DEECE66DL + 0xBL) & 0xFFFFFFFFFFFF;
+    return static_cast<int>(seed >> 17);
+}
+
+template<typename T>
+T* bubbleSort(const T* in, int size, int (*key)(const T&)) {
+    bool madeSwap = false; // flag to know if we are done
+    // we need to create a modifiable copy of the array
+    T* out = new T[size];
+    for (unsigned int i = 0; i < size; i++) {
+        out[i] = in[i];
+    }
+    // make the bubble sort
+    do {
+        madeSwap = false;
+        for (unsigned int i = 0; i < size - 1; i++) {
+            // if this element is bigger that the next one swap places
+            if (key(out[i]) > key(out[i + 1])) {
+                madeSwap = true;
+                T val = out[i + 1];
+                out[i + 1] = out[i];
+                out[i] = val;
+            }
+        }
+    } while (madeSwap);
+    return out;
+}
+
+void cacheTest() {
+    for (int size = 512; size < MAX_SIZE; size *= 2) {
+        printf("Cache Test with size = %9d | ", size);
+        constexpr int max = 500;
+        int* a = new int[size];
+        seed = 0;
+        for (int i = 0; i < size; i++) {
+            a[i] = randomInt() % max;
+        }
+        long time = -getMillis();
+        int* b = bubbleSort(a, size, intKey);
+        time += getMillis();
+        printf("%10ld ms | %7.2lf ms / entry \n", time,
+            (static_cast<double>(time) / size));
+        delete[] a;
+        delete[] b;
+    }
+}
+
+struct A {
+    int key;
+    char filler[32];
+};
+
+int aKey(const A& a) {
+    return a.key;
+}
+
+void structTest() {
+    for (int size = 512; size < MAX_SIZE; size *= 2) {
+        printf("Struct Test with size = %9d | ", size);
+        constexpr int max = 500;
+        A* a = new A[size];
+        seed = 0;
+        for (int i = 0; i < size; i++) {
+            a[i].key = randomInt() % max;
+        }
+        long time = -getMillis();
+        A* b = bubbleSort(a, size, aKey);
+        time += getMillis();
+        printf("%10ld ms | %7.2lf ms / entry \n", time,
+            (static_cast<double>(time) / size));
+        delete[] a;
+        delete[] b;
+    }
+}
+
+int pointerKey(int* const& a) {
+    return *a;
+}
+
+void pointerTest() {
+    for (int size = 512; size < MAX_SIZE; size *= 2) {
+        printf("Pointer Test with size = %9d | ", size);
+        constexpr int max = 500;
+        int** a = new int* [size];
+        seed = 0;
+        for (int i = 0; i < size; i++) {
+            a[i] = new int(randomInt() % max);
+        }
+        long time = -getMillis();
+        int** b = bubbleSort<int*>(a, size, pointerKey);
+        time += getMillis();
+        printf("%10ld ms | %7.2lf ms / entry \n", time,
+            (static_cast<double>(time) / size));
+        for (int i = 0; i < size; i++) {
+            delete a[i];
+        }
+        delete[] a;
+        delete[] b;
+    }
+}
+
 int main() {
-    std::cout << "Test\n";
+    cacheTest();
+    structTest();
+    pointerTest();
     return 0;
-}
+}