diff --git a/Radix_sort.cpp b/Radix_sort.cpp new file mode 100644 index 0000000..43ef94d --- /dev/null +++ b/Radix_sort.cpp @@ -0,0 +1,97 @@ +#include +using namespace std; +struct node { + int data; + node* next; +}; + +struct node* create(int x) +{ + node* temp = new node(); + temp->data = x; + temp->next = NULL; + + return temp; +} + +void insert(node*& head, int n) +{ + if (head == NULL) { + head = create(n); + return; + } + + node* t = head; + while (t->next != NULL) + t = t->next; + t->next = create(n); +} + +int del(node*& head) +{ + if (head == NULL) + return 0; + node* temp = head; + int val = head->data; + + head = head->next; + + delete temp; + return val; +} + +int digits(int n) +{ + int i = 1; + if (n < 10) + return 1; + + while (n > (int)pow(10, i)) + i++; + return i; +} + +void radix_sort(vector& arr) +{ + int sz = arr.size(); + int max_val = *max_element(arr.begin(), arr.end()); + int d = digits(max_val); + + node** bins; + + bins = new node*[10]; + + for (int i = 0; i < 10; i++) + bins[i] = NULL; + + for (int i = 0; i < d; i++) { + for (int j = 0; j < sz; j++) // bins updation + insert(bins[(arr[j] / (int)pow(10, i)) % 10], + arr[j]); + + int x = 0, y = 0; + + while (x < 10) { + while (bins[x] != NULL) + arr[y++] = del(bins[x]); + x++; + } + } +} + +void print(vector arr) +{ + for (int i = 0; i < arr.size(); i++) + cout << arr[i] << " "; + cout << endl; +} + +int main() +{ + vector arr = { 573, 15, 24, 32, 4523, 214 }; + + radix_sort(arr); + print(arr); + + return 0; +}