Pagini recente » Cod sursa (job #2634411) | Cod sursa (job #2458553) | Cod sursa (job #452824) | Cod sursa (job #2975590) | Cod sursa (job #1193831)
#include <fstream>
#include <cstring>
using namespace std;
const int N = 1 + 1e6, B = 8;
int v[N], n;
template<class Type>
void radix(Type v[], int n){
Type aux[n + 1];
int cnt[ (1 << B) + 1 ], mask = (1 << B) - 1;
for (int shr = 0 ; shr < sizeof(Type) ; shr += B){
memset(cnt, 0 ,sizeof(cnt));
cnt[0] = 1;
for (int i = 1 ; i <= n ; i++)
cnt[ 1 + ( ( v[i] >> shr ) & mask ) ]++;
for (int i = 1 ; i < (1 << B) ; i++)
cnt[i] += cnt[i - 1];
for (int i = 1 ; i <= n ; i++)
aux[ cnt[ ( v[i] >> shr ) & mask ]++ ] = v[i];
memcpy(v, aux, sizeof(aux));
}
}
void gen(int n, int a, int b, int c){
v[0] = 0;
for (int i = 1 ; i <= n ; i++)
v[i] = (a * v[i - 1] + b) % c;
}
int main(){
int n, a, b, c;
ifstream in("radixsort.in");
in >> n >> a >> b >> c;
in.close();
gen(n, a, b, c);
radix(v, n);
ofstream out("radixsort.out");
for (int i = 1 ; i <= n ; i += 1)
out << v[i] << ' ';
out << '\n';
for (int i = 1 ; i <= n ; i++)
if ( v[i] < v[i - 1])
out << "Shit at " << i << '\n';
out.close();
return 0;
}