Browse Source

counting sort

Kajetan Johannes Hammerle 3 years ago
parent
commit
800d578762
1 changed files with 103 additions and 1 deletions
  1. 103 1
      couting_sort/Main.cpp

+ 103 - 1
couting_sort/Main.cpp

@@ -1,6 +1,108 @@
+#include <chrono>
 #include <iostream>
 
+long getNanos() {
+    return std::chrono::high_resolution_clock::now().time_since_epoch().count();
+}
+
+int intKey(const int& i) {
+    return i;
+}
+
+template<typename T>
+T* countingSort(const T* in, int size, int max, int (*key)(const T&)) {
+    max++;
+    int* counter = new int[max];
+    for(int i = 0; i < max; i++) {
+        counter[i] = 0;
+    }
+    for(int i = 0; i < size; i++) {
+        counter[key(in[i])]++;
+    }
+    for(int i = 1; i < max; i++) {
+        counter[i] += counter[i - 1];
+    }
+    T* out = new T[size];
+    for(int i = size - 1; i >= 0; i--) {
+        out[counter[key(in[i])]-- - 1] = in[i];
+    }
+    delete[] counter;
+    return out;
+}
+
+void cacheTest() {
+    for(int size = 512; size < 100'000'000; size *= 2) {
+        printf("Cache Test with size = %9d | ", size);
+        constexpr int max = 500;
+        int* a = new int[size];
+        for(int i = 0; i < size; i++) {
+            a[i] = rand() % max;
+        }
+        long time = -getNanos();
+        int* b = countingSort(a, size, max - 1, intKey);
+        time += getNanos();
+        printf("%10ld ns | %7.2lf ns / 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 < 100'000'000; size *= 2) {
+        printf("Struct Test with size = %9d | ", size);
+        constexpr int max = 500;
+        A* a = new A[size];
+        for(int i = 0; i < size; i++) {
+            a[i].key = rand() % max;
+        }
+        long time = -getNanos();
+        A* b = countingSort(a, size, max - 1, aKey);
+        time += getNanos();
+        printf("%10ld ns | %7.2lf ns / 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 < 100'000'000; size *= 2) {
+        printf("Pointer Test with size = %9d | ", size);
+        constexpr int max = 500;
+        int** a = new int*[size];
+        for(int i = 0; i < size; i++) {
+            a[i] = new int(rand() % max);
+        }
+        long time = -getNanos();
+        int** b = countingSort<int*>(a, size, max - 1, pointerKey);
+        time += getNanos();
+        printf("%10ld ns | %7.2lf ns / 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;
 }