TheAlgorithms/C++ 1.0.0
All the algorithms implemented in C++
Loading...
Searching...
No Matches
radix_sort2.cpp File Reference

Algorithm of Radix sort More...

#include <algorithm>
#include <cassert>
#include <cstdint>
#include <iostream>
#include <vector>
Include dependency graph for radix_sort2.cpp:

Go to the source code of this file.

Namespaces

namespace  sorting
 for working with vectors
 
namespace  radix_sort
 Functions for Radix sort algorithm.
 

Functions

std::vector< uint64_t > sorting::radix_sort::step_ith (uint16_t cur_digit, const std::vector< uint64_t > &ar)
 Function to sort vector according to current digit using stable sorting.
 
std::vector< uint64_t > sorting::radix_sort::radix (const std::vector< uint64_t > &ar)
 Function to sort vector digit by digit.
 
static void tests ()
 Function to test the above algorithm.
 
int main ()
 Main function.
 

Detailed Description

Algorithm of Radix sort

Author
Suyash Jaiswal

Sort the vector of unsigned integers using radix sort i.e. sorting digit by digit using Counting Sort as subroutine. Running time of radix sort is O(d*(n+b)) where b is the base for representing numbers and d in the max digits in input integers and n is number of unsigned integers. consider example for n = 5, aray elements = 432,234,143,332,123 sorting digit by digit sorting according to 1) 1st digit place => 432, 332, 143, 123, 234

2) 2nd digit place => 123, 432, 332, 234, 143

3) 3rd digit place => 123, 143, 234, 332, 432

using count sort at each step, which is stable. stable => already sorted according to previous digits.

Definition in file radix_sort2.cpp.

Function Documentation

◆ main()

int main ( void )

Main function.

Returns
0 on exit

Definition at line 119 of file radix_sort2.cpp.

119 {
120 tests(); // execute the tests
121 return 0;
122}
static void tests()
Function to test the above algorithm.

◆ radix()

std::vector< uint64_t > sorting::radix_sort::radix ( const std::vector< uint64_t > & ar)

Function to sort vector digit by digit.

Parameters
ar- vector to be sorted
Returns
sorted vector

Definition at line 82 of file radix_sort2.cpp.

82 {
83 uint64_t max_ele =
84 *max_element(ar.begin(), ar.end()); // returns the max element.
85 std::vector<uint64_t> temp = ar;
86 for (int i = 1; max_ele / i > 0;
87 i *= 10) { // loop breaks when i > max_ele because no further digits
88 // left to makes changes in aray.
89 temp = step_ith(i, temp);
90 }
91 for (uint64_t i : temp) {
92 std::cout << i << " ";
93 }
94 std::cout << "\n";
95 return temp;
96}
std::vector< uint64_t > step_ith(uint16_t cur_digit, const std::vector< uint64_t > &ar)
Function to sort vector according to current digit using stable sorting.

◆ step_ith()

std::vector< uint64_t > sorting::radix_sort::step_ith ( uint16_t cur_digit,
const std::vector< uint64_t > & ar )

Function to sort vector according to current digit using stable sorting.

Parameters
cur_digit- sort according to the cur_digit
ar- vector to be sorted
Returns
std::vector sorted till ith digit

Definition at line 51 of file radix_sort2.cpp.

53 { // sorting according to current digit.
54 int n = ar.size();
55 std::vector<uint32_t> position(10, 0);
56 for (int i = 0; i < n; ++i) {
57 position[(ar[i] / cur_digit) %
58 10]++; // counting frequency of 0-9 at cur_digit.
59 }
60 int cur = 0;
61 for (int i = 0; i < 10; ++i) {
62 int a = position[i];
63 position[i] = cur; // assingning starting position of 0-9.
64 cur += a;
65 }
66 std::vector<uint64_t> temp(n);
67 for (int i = 0; i < n; ++i) {
68 temp[position[(ar[i] / cur_digit) % 10]] =
69 ar[i]; // storing ar[i] in ar[i]'s cur_digit expected position of
70 // this step.
71 position[(ar[i] / cur_digit) %
72 10]++; // incrementing ar[i]'s cur_digit position by 1, as
73 // current place used by ar[i].
74 }
75 return temp;
76}

◆ tests()

static void tests ( )
static

Function to test the above algorithm.

Returns
none

Test 1

Test 2

Definition at line 104 of file radix_sort2.cpp.

104 {
106 std::vector<uint64_t> ar1 = {432, 234, 143, 332, 123};
108 assert(std::is_sorted(ar1.begin(), ar1.end()));
110 std::vector<uint64_t> ar2 = {213, 3214, 123, 111, 112, 142,
111 133, 132, 32, 12, 113};
113 assert(std::is_sorted(ar2.begin(), ar2.end()));
114}
std::vector< uint64_t > radix(const std::vector< uint64_t > &ar)
Function to sort vector digit by digit.