Pagini recente » Cod sursa (job #2505011) | Borderou de evaluare (job #2017693) | Borderou de evaluare (job #2794077) | Borderou de evaluare (job #2013300) | Cod sursa (job #3209194)
#include <bits/stdc++.h>
#define MAX_N 10000000
#define MAXDIGITS 10
int arr[MAX_N];
void _count_sort(int *v, int *new_v, int len, int exp)
{
int count[MAXDIGITS] = {0};
for (int i = 0; i < len; ++i)
count[(v[i] / exp) % 10]++;
for (int i = 1; i < MAXDIGITS; ++i)
count[i] += count[i - 1];
for (int i = len - 1; i >= 0; --i) {
int &cnt = count[(v[i] / exp) % 10];
new_v[cnt - 1] = v[i];
--cnt;
}
memcpy(v, new_v, len * sizeof(int));
}
void radix_sort(int *v, int len)
{
int max_nr = INT_MIN;
int max_digits = 0;
int *aux_arr;
for (int i = 0; i < len; ++i)
if (v[i] > max_nr)
max_nr = v[i];
for (;max_nr > 0; max_nr /= 10)
++max_digits;
aux_arr = new int[len];
for (int i = 0, exp = 1; i < max_digits; ++i, exp *= 10)
_count_sort(v, aux_arr, len, exp);
delete[] aux_arr;
}
int main()
{
int n, a, b, c;
std::ifstream fin("radixsort.in");
fin >> n >> a >> b >> c;
fin.close();
arr[0] = b;
for (int i = 1; i < n; ++i)
arr[i] = (a * arr[i - 1] + b) % c;
radix_sort(arr, n);
std::ofstream fout("radixsort.out");
for (int i = 0; i < n; i += 10)
fout << arr[i] << ' ';
fout << '\n';
fout.close();
}