Pagini recente » Cod sursa (job #64253) | Cod sursa (job #2089879) | Cod sursa (job #2016877) | Cod sursa (job #3176590) | Cod sursa (job #2220092)
/**
* Worg
*/
#include <cstdio>
FILE *fin = freopen("algsort.in", "r", stdin); FILE *fout = freopen("algsort.out", "w", stdout);
const int MAX_N = 5e5 + 5;
const int BYTE = 1 << 8;
/*-------- Data --------*/
int n;
int arr[MAX_N], aux[MAX_N];
int idx[BYTE];
/*-------- --------*/
void GenerateArray() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &arr[i]);
}
}
void RadixSort() {
const int bucketCount = 4; // Each bucket has 8 bits
for(int bucket = 0; bucket < bucketCount; bucket++) {
// Reset the contors
for(int i = 0; i < BYTE; i++) {
idx[i] = 0;
}
// Get each number's bucket corresponding to the current bit
for(int i = 1; i <= n; i++) {
int val = (arr[i] >> (bucket << 3)) & (BYTE - 1);
idx[val]++;
}
// Compute the contors
for(int i = 1; i < BYTE; i++) {
idx[i] += idx[i - 1];
}
// Rearrange the numbers
for(int i = n; i >= 1; i--) {
int val = (arr[i] >> (bucket << 3)) & (BYTE - 1);
aux[idx[val]] = arr[i];
idx[val]--;
}
for(int i = 1; i <= n; i++) {
arr[i] = aux[i];
}
}
}
int main() {
GenerateArray();
RadixSort();
for(int i = 1; i <= n; i++) {
printf("%d ", arr[i]);
}
return 0;
}