Cod sursa(job #485332)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 18 septembrie 2010 09:07:19
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<fstream>
#include<iostream>
using namespace std;

void radix_sort(int byte, int n ,unsigned long *src, unsigned long *dest)
{
	unsigned long count[256]={0};
	unsigned long index[256]={0};
	for(int i=0; i<n; ++i)
		count[(src[i]>>(byte<<3))&0xff]++;
	for(int i=1; i<256; ++i)
		index[i]=index[i-1]+count[i-1];
	for(int i=0; i<n; ++i)
		dest[index[(src[i]>>(byte<<3))&0xff]++]=src[i];
}

void radix_sort16(int byte, int n ,unsigned long *src, unsigned long *dest)
{
	unsigned long count[0xffff]={0};
	unsigned long index[0xffff]={0};
	for(int i=0; i<n; ++i)
		count[(src[i]>>(byte<<4))&0xffff]++;
	for(int i=1; i<0xffff; ++i)
		index[i]=index[i-1]+count[i-1];
	for(int i=0; i<n; ++i)
		dest[index[(src[i]>>(byte<<4))&0xffff]++]=src[i];
}

int main()
{
	int n;
	
	unsigned long *a;
	unsigned long *b;
	fstream fin("algsort.in", fstream::in);
	fstream fout("algsort.out", fstream::out);
	
	double x;
	unsigned long long *y;
	y=reinterpret_cast<unsigned long long*>(&x);
	
	fin>>n;
	a=new unsigned long[n];
	b=new unsigned long[n];
	
	for(int i=0; i<n; ++i)
	{
		fin>>a[i];
		//cout<<a[i]<<" ";
	}
	//cout<<endl;
	
	radix_sort(0,n,a,b);
	radix_sort(1,n,b,a);
	radix_sort(2,n,a,b);
	radix_sort(3,n,b,a);
	//radix_sort16(0,n,a,b);
	//radix_sort16(1,n,b,a);
	
	for(int i=0; i<n; ++i)
		fout<<a[i]<<" ";
	fout<<endl;
	
	delete a;
	delete b;
	
	fin.close();
	fout.close();
	return 0;
}