From d9bcee779c8eebfe7dbfa504f35802e3841adb81 Mon Sep 17 00:00:00 2001
From: sarth23 <60581001+sarth23@users.noreply.github.com>
Date: Sat, 3 Oct 2020 02:52:34 +0530
Subject: [PATCH] Create c++ bin sort

---
 c++ bin sort | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 98 insertions(+)
 create mode 100644 c++ bin sort

diff --git a/c++ bin sort b/c++ bin sort
new file mode 100644
index 0000000..7e1c7b3
--- /dev/null
+++ b/c++ bin sort	
@@ -0,0 +1,98 @@
+#include <iostream>
+
+using namespace std;
+ 
+template <class T>
+void Print(T& vec, int n, string s){
+    cout << s << ": [" << flush;
+    for (int i=0; i<n; i++){
+        cout << vec[i] << flush;
+        if (i < n-1){
+            cout << ", " << flush;
+        }
+    }
+    cout << "]" << endl;
+}
+ 
+int Max(int A[], int n){
+    int max = -32768;
+    for (int i=0; i<n; i++){
+        if (A[i] > max){
+            max = A[i];
+        }
+    }
+    return max;
+}
+ 
+// Linked List node
+class Node{
+public:
+    int value;
+    Node* next;
+};
+ 
+void Insert(Node** ptrBins, int idx){
+    Node* temp = new Node;
+    temp->value = idx;
+    temp->next = nullptr;
+ 
+    if (ptrBins[idx] == nullptr){ // ptrBins[idx] is head ptr
+        ptrBins[idx] = temp;
+    } else {
+        Node* p = ptrBins[idx];
+        while (p->next != nullptr){
+            p = p->next;
+        }
+        p->next = temp;
+    }
+}
+ 
+int Delete(Node** ptrBins, int idx){
+    Node* p = ptrBins[idx];  // ptrBins[idx] is head ptr
+    ptrBins[idx] = ptrBins[idx]->next;
+    int x = p->value;
+    delete p;
+    return x;
+}
+ 
+void BinSort(int A[], int n){
+    int max = Max(A, n);
+ 
+    // Create bins array
+    Node** bins = new Node* [max + 1];
+ 
+    // Initialize bins array with nullptr
+    for (int i=0; i<max+1; i++){
+        bins[i] = nullptr;
+    }
+ 
+    // Update count array values based on A values
+    for (int i=0; i<n; i++){
+        Insert(bins, A[i]);
+    }
+ 
+    // Update A with sorted elements
+    int i = 0;
+    int j = 0;
+    while (i < max+1){
+        while (bins[i] != nullptr){
+            A[j++] = Delete(bins, i);
+        }
+        i++;
+    }
+ 
+    // Delete heap memory
+    delete [] bins;
+}
+ 
+int main() {
+ 
+    int A[] = {2, 5, 8, 12, 3, 6, 7, 10};
+    int n = sizeof(A)/sizeof(A[0]);
+ 
+    Print(A, n, "\t\tA");
+    BinSort(A, n);
+    Print(A, n, " Sorted A");
+    cout << endl;
+    return 0;
+}