Untitled
unknown
plain_text
3 years ago
1.5 kB
43
Indexable
#include <iostream>
#include <climits>
using namespace std;
void printArray(int * arr, int n){
for(int i=0; i<n; i++) cout << arr[i] << ", ";
cout << endl;
}
void countSortHelper(int * arr, int n, int exp){
// - 287, 39, 48, 56, 785, exp - 1
int * farr = new int[10];
// 2nd step - find these frequencies
for(int i=0; i<n; i++){
int idx = (arr[i] / exp) % 10; // [ 3 to 10]
farr[idx]++;
}
// 3rd step - cummulative sum
for(int i=1; i<10; i++){
farr[i] = farr[i] + farr[i-1];
}
int * ans = new int[n];
for(int i=n-1; i>=0; i--){
int pos = farr[(arr[i] / exp) % 10];
int idx = pos - 1;
ans[idx] = arr[i];
farr[(arr[i] / exp) % 10]--;
}
for(int i=0; i<n; i++) arr[i] = ans[i];
}
void radixSort(int * arr, int n){
// find the maximum value
int maxValue = arr[0];
for(int i=1; i<n; i++){
maxValue = max(maxValue, arr[i]);
}
// count sort call
int exp = 1;
while(exp <= maxValue){
countSortHelper(arr, n, exp); // sort array based on digits
exp = exp * 10;
}
}
// void countSort(int * arr, int n){
// // 1st step - finding the range
// int maxValue = arr[0], minValue = arr[0];
// for(int i=1; i<n; i++){
// maxValue = max(maxValue, arr[i]);
// minValue = min(minValue, arr[i]);
// }
// countSortHelper(arr, n, maxValue, minValue);
// }
int main() {
// your code goes here
int n;
cin >> n;
int arr[n];
for(int i=0; i<n; i++) cin >> arr[i];
printArray(arr, n);
radixSort(arr, n);
printArray(arr, n);
return 0;
}Editor is loading...