Pagini recente » Cod sursa (job #1006287) | Cod sursa (job #1827806) | Cod sursa (job #691177) | Cod sursa (job #529606) | Cod sursa (job #1419587)
#include <stdio.h>
#define MAX_N 500000
#define BITS 8
#define MASK ((1 << BITS) - 1)
#define THRESHOLD 64
int v[MAX_N];
inline void insertionSort(int lo, int hi) {
for (int i = lo; i < hi; i++) {
// insereaza v[i] in v[lo..i]
int x = v[i];
int j = i;
while ((j > lo) && (v[j - 1] > x)) {
v[j] = v[j - 1];
j--;
}
v[j] = x;
}
}
void radixSort(int lo, int hi, int bits) {
int ptr[1 << BITS], end[1 << BITS] = { };
for (int i = lo; i < hi; i++) {
end[(v[i] >> bits) & MASK]++;
}
// deplasement
ptr[0] = lo;
end[0] += lo;
for (int i = 1; i < (1 << BITS); i++) {
ptr[i] = end[i - 1];
end[i] += end[i - 1];
}
for (int i = 0; i < (1 << BITS); i++) {
while (ptr[i] != end[i]) {
int elem = v[ptr[i]];
int bucket = (elem >> bits) & MASK;
while (bucket != i) {
int tmp = v[ptr[bucket]];
v[ptr[bucket]++] = elem;
elem = tmp;
bucket = (elem >> bits) & MASK;
}
v[ptr[i]++] = elem;
}
}
if (bits) {
for (int i = 0; i < (1 << BITS); i++) {
int size = end[i] - (i ? end[i - 1] : lo);
if (size > THRESHOLD) {
radixSort(end[i] - size, end[i], bits - BITS);
} else if (size > 1) {
insertionSort(end[i] - size, end[i]);
}
}
}
}
int main(void) {
FILE *f;
int n;
f = fopen("algsort.in", "r");
fscanf(f, "%d", &n);
for (int i = 0; i < n; i++) {
fscanf(f, "%d", &v[i]);
}
fclose(f);
radixSort(0, n, 24);
f = fopen("algsort.out", "w");
for (int i = 0; i < n; i++) {
fprintf(f, "%d ", v[i]);
}
fclose(f);
return 0;
}