Pagini recente » Cod sursa (job #2101360) | Cod sursa (job #2803500) | Cod sursa (job #3352928) | Cod sursa (job #236336) | Cod sursa (job #3327686)
#include <stdio.h>
#define MAX_N 500000
#define BITS_PER_STEP 4
int v[MAX_N], aux[MAX_N];
int freq[1 << BITS_PER_STEP], ind[1 << BITS_PER_STEP];
void sort(int v1[], int v2[], int left, int right, int bitNumber) {
if (left >= right || bitNumber == 0)
return;
int i;
for (i = 0; i < (1 << BITS_PER_STEP); ++i)
freq[i] = ind[i] = 0;
for (i = left; i <= right; ++i) {
int bucketNumber = (v1[i] >> (bitNumber - BITS_PER_STEP)) & ((1 << BITS_PER_STEP) - 1);
++freq[bucketNumber];
}
ind[0] = 0;
for (i = 1; i < (1 << BITS_PER_STEP); ++i)
ind[i] = ind[i - 1] + freq[i - 1];
for (i = left; i <= right; ++i) {
int bucketNumber = (v1[i] >> (bitNumber - BITS_PER_STEP)) & ((1 << BITS_PER_STEP) - 1);
v2[left + ind[bucketNumber]] = v1[i];
ind[bucketNumber]++;
}
int add = 0;
for (i = 0; i < (1 << BITS_PER_STEP); ++i)
{
sort(v2, v1, left + add, left + add + freq[i] - 1, bitNumber - BITS_PER_STEP);
add += freq[i];
}
}
int main() {
FILE* fin = fopen("algsort.in", "r");
int n, i;
fscanf(fin, "%d", &n);
for (i = 0; i < n; ++i)
fscanf(fin, "%d", &v[i]);
fclose(fin);
// Sortam intre [0, n - 1], pornind de la cel mai semnificativ bit (al 32-lea)
sort(v, aux, 0, n - 1, 32);
FILE* fout = fopen("algsort.out", "w");
for (i = 0; i < n; ++i)
fprintf(fout, "%d ", v[i]);
fclose(fout);
return 0;
}