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; +}