Cod sursa(job #1754810)

Utilizator sulzandreiandrei sulzandrei Data 8 septembrie 2016 19:10:56
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.47 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <unordered_map>
using namespace std;

#define nmax 500003


ifstream in("algsort.in");
ofstream out("algsort.out");
//////////////////////////////////
/////////
/////////               Numsort
/////////
//////////////////////////////////
void numsorst(int *A,int n)//sortam in timp O(n) unde valoarea maxima a unui numar este K
{
    int max_el = *max_element(A,A+n);//valoarea maxim
    int B[nmax];//vectorul in care vom tina la final rezultatul
    unordered_map<int,int>C;//locul unde numaram aparitiile fiecarui numar
    for(int i = 0 ; i <= max_el; i ++)
        C[i] = 0;//initial sunt 0
    for(int i = 0 ; i < n ; i++)
        C[A[i]]++;//vectorul de frecventa
    for(int i =1 ; i<= max_el; i++)//facem sume partiale
        C[i] = C[i-1]+C[i];//deci C[i] = numarul de numere <= elementul i adica pozitia
        //in vectorul sortat a valorii i este C[i]
    for(int i = 0 ; i < n ; i++)//pentru fiecare valoare
    {
        B[C[A[i]]-1] = A[i];//pozitia C[A[i]]= nr de numere <= A[i] deci pozitia in vectorul sortat
        C[A[i]]--;//scadem valoarea deoarece am puso deja pe o pozitie
    }
    for(int i = 0 ; i< n ; i++)
        A[i] = B[i];//si schimbam valorile
}
//////////////////////////////
///////////
///////////      LSD Radix sort using countsort for bytes
///////////
//////////////////////////////

const int max_byte = (1<<8)-1;
const int nr_bytes = sizeof(int);
inline int ithbyte(int n,int i)
{
    return (n>>(i*8))&max_byte;
}
void byte_numsort(int *A, int *B,int n, int byte_nr)
{
    int C[max_byte+1];
    for(int i = 0 ; i < n ; i ++)
        C[ithbyte(A[i],byte_nr)]++,
        std::cout  <<A[i]<<" ";
    for(int i = 1 ; i <= byte_nr ; i++)
        C[ithbyte(A[i],byte_nr)] += C[ithbyte(A[i],byte_nr)-1],std::cout  <<A[i]<<" ";
    for(int i = 0 ; i < n ; i++)
        B[C[ithbyte(A[i],byte_nr)]--] = A[i],std::cout  <<A[i]<<" ";
}
void LDS_byte_radixsort(int *v, int n)
{
    int temp[n+1];
    for(int i = 0 ;i < nr_bytes ; i++)
    {
        byte_numsort(v,temp,n,i);
        for(int j = 0 ; j < n ; j++)
        {
            v[j] = temp[j];
            std::cout  <<v[j]<<" ";
        }
    }
}

int main()
{
    int n,i;
    in >> n;

    int v[n+5];
    for( i = 0 ; i < n ; i++)
        in >> v[i];

    LDS_byte_radixsort(v,n);
    for(int i = 0 ; i < n ; i ++)
        out << v[i] << " ";
    return 0;
}