Cod sursa(job #1502260)

Utilizator TeodorCotetCotet Teodor TeodorCotet Data 14 octombrie 2015 14:18:08
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#include <queue>
#include <cstring>

using namespace std;

ifstream fin("algsort.in");
ofstream fout("algsort.out");

const int NMAX = 500001;
const int mask = (1 << 8) - 1;

int N;

int v[NMAX]; int u[NMAX];

int freq[mask + 1]; 

void read() {

	fin >> N;

	
	for(int i = 1 ; i <= N; ++i)
		fin >> v[i];
}

void radix_sort() {

	for(int i = 0 ;i < 31; i += 8) {

		for(int j = 0 ; j <= mask ; ++j) freq[j] = 0;

		for(int j = 1 ; j <= N; ++j) freq[mask & (v[j] >> i)]++; // cate numere cu cheia x sunt

		for(int j = 1 ; j <= mask ; ++j) freq[j] += freq[j - 1]; //freq[j] = pe a cata pozitie se afla numarull cu cheia j(maxima)
		//nr cu cea mai mica cheia != pozitia 0 
		
		for(int j = N  ; j ; --j) u[ freq[ mask & (v[j] >> i)]-- ] = v[j]; 
		//il scadem pentru ca frq[i] reprezinta cea mai mare pozitie posibila pentru numarul cu key-ul = i
		//neaparat de parcurs invers!!

		for(int j = 1 ; j <= N; ++j) v[j] = u[j];
	}
}

int main() {


	read();

	radix_sort();

	for(int i = 1; i <= N; i++)
		fout << v[i] << " ";

	return 0;
}