Pagini recente » Cod sursa (job #2718189) | Cod sursa (job #115972) | Cod sursa (job #1712503) | Cod sursa (job #408942) | Cod sursa (job #2674658)
// Radix sort with base 16
// Also hacks
#include <stdio.h>
void swap(int& a, int& b) {
int aux = a;
a = b;
b = aux;
}
inline bool isDigit(char c) {
return c >= '0' && c <= '9';
}
// citire numar natural
int readInt(FILE* fin) {
char ch;
int res = 0;
// eliminam caracterele de dinaintea numarului (spatiu, rand nou, orice caracter care nu este cifra)
while (!isDigit(ch = fgetc(fin)));
// adaugam cifrele la numar pana cand caracterul citit nu mai este cifra
do {
res = 10 * res + ch - '0';
} while (isDigit(ch = fgetc(fin)));
return res;
}
#define MAX_N 500000
#define BASE 16
int v[MAX_N];
int bucket[BASE][1 << 18];
void sort(int v[], int n, int bitNumber) {
if (bitNumber == 8)
return;
int i, b, j;
for (i = 0; i < n; ++i) {
b = v[i] >> (bitNumber << 2) & 15;
bucket[b][++bucket[b][0]] = v[i];
}
i = 0;
for (b = 0; b < BASE; ++b) {
for (j = 1; j <= bucket[b][0]; ++j)
v[i++] = bucket[b][j];
bucket[b][0] = 0;
}
sort(v, n, bitNumber + 1);
}
int main() {
FILE* fin = fopen("algsort.in", "r");
int n, i;
fscanf(fin, "%d", &n);
for (i = 0; i < n; ++i)
v[i] = readInt(fin);
fclose(fin);
sort(v, n, 0);
FILE* fout = fopen("algsort.out", "w");
for (i = 0; i < n; ++i)
fprintf(fout, "%d ", v[i]);
fclose(fout);
return 0;
}