Cod sursa(job #1433659)

Utilizator k_ounu_eddyIacob Eduard k_ounu_eddy Data 9 mai 2015 17:37:22
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include <cstring>
#define TOTAL_BYTES sizeof(v[0])
using namespace std;

void genereazaNumere(int *v, int N, int A, int B, int C, int &max)
{
v[0] = B;
max = v[0];
for(int i=1;i<N;i++){
v[i] = (A * v[i-1] + B) % C;
if(max<v[i])
max = v[i];
}
}

void printVector(int *v, int N)
{
ofstream fout("radixsort.out");
for(int i = 0; i < N; i +=10)
        fout << v[i]<< ' ';
    fout<<endl;
}

void printFirstNNumbers(int n)
{
for(int i=0;i<n;i++)
cout<<i<<" ";
cout<<endl;
}

void countSort(int *A, int *B, int N, int byteNumber, int max)
{
int *counter;
counter = new int[255];

memset(counter, 0, 255 * sizeof(int));

#ifdef debug
cout<<"A=";
printVector(A, N);
cout<<endl;
/*	cout<<"  ";
printFirstNNumbers(max);
_getch();*/
#endif

for(int i=0;i<N;i++)
{
counter[(A[i]>>(8*byteNumber)) & 0xff] += 1;

#ifdef debug
cout<<"c=";
printVector(counter, max);
cout<<" A["<<i<<"]:"<<A[i]<<endl;	
#endif
}
for(int i=1;i<255;i++){
counter[i] = counter[i-1] + counter[i];
}

#ifdef debug
cout<<"c=";
printVector(counter, 255);	
#endif
for(int i=N-1;i>=0;i--)
{	
/*while(aux<counter[i])
{
B[aux] = i;
aux++;
}*/
B[counter[A[i]>>(8*byteNumber) & 0xff]-1] = A[i];
counter[A[i]>>(8*byteNumber) & 0xff]--;
}
#ifdef debug
cout<<"Dupa prima sortare:"<<endl;
printVector(B, N);
cout<<endl;
_getch();
#endif
delete[] counter;
}

void radixSort(int *v, int N, int max)
{
int* temp = new int[N];
//for(int i=0;i<TOTAL_BYTES;i++)
//if(i%2 == 0)
countSort(v, temp, N, 0, max);
countSort(temp, v, N, 1, max);	
countSort(v, temp, N, 2, max);	
countSort(temp, v, N, 3, max);	
printVector(v,N);	
delete[] temp;
}

int main()
{
long long N,A,B,C;

fstream fin("radixsort.in");

int max = -1;
fin>>N>>A>>B>>C;

int *v = new int[N];

genereazaNumere(v,N,A,B,C,max);
max++;
radixSort(v, N, max);

delete[] v;
fin.close();

return 0;
}