Pagini recente » Cod sursa (job #80887) | Cod sursa (job #1634688) | Cod sursa (job #376839) | Cod sursa (job #1576000) | Cod sursa (job #2706406)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
const int MAX_N = 10000000;
const int NO_BUCKETS = (1 << 8);
uint32_t numbers[MAX_N];
uint32_t get_byte(uint32_t number, int byte) {
uint32_t mask = 0xFF;
return ((number >> (byte * 8)) & mask);
}
void countsort(int n, uint32_t * numbers, uint32_t * temp, int byte) {
int * buckets = (int *) calloc(NO_BUCKETS, sizeof(int));
for (int j = 0; j < n; j++) {
buckets[get_byte(numbers[j], byte)]++;
}
for (int j = 1; j < NO_BUCKETS; j++) {
buckets[j] += buckets[j - 1];
}
for (int j = n - 1; j >= 0; j--) {
temp[--buckets[get_byte(numbers[j], byte)]] = numbers[j];
}
free(buckets);
}
void radixsort(int n, uint32_t * numbers) {
uint32_t * temp = (uint32_t *) malloc(n * sizeof(uint32_t));
for (int i = 0; i < sizeof(uint32_t); i++) {
if (i % 2 == 0) {
countsort(n, numbers, temp, i);
} else {
countsort(n, temp, numbers, i);
}
}
free(temp);
}
int main() {
int n, a, b, c;
FILE * f;
f = fopen("radixsort.in", "r");
fscanf(f, "%d%d%d%d", &n, &a, &b, &c);
fclose(f);
numbers[0] = b % c;
for (int i = 1; i < n; i++) {
numbers[i] = (1LL * a * numbers[i - 1] % c + b) % c;
}
radixsort(n, numbers);
f = fopen("radixsort.out", "w");
for (int i = 0; i < n; i += 10) {
fprintf(f, "%d ", numbers[i]);
}
fclose(f);
return 0;
}