Cod sursa(job #1013083)

Utilizator ELHoriaHoria Cretescu ELHoria Data 20 octombrie 2013 11:22:45
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <ctime>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <vector>

using namespace std;

const int nmax = int(1e7), base = 256;
int n;
int a[nmax];
vector<int> bucket[base];

void generateData() {
	srand(time(0));
	n = int(1e7);
	for(int i = 0;i < n;i++) {
		a[i] = rand();
	}
}

void LSDRadixSort() {
	int p = 1;
	for(int k = 0;k < 9;k++) {
		for(int i = 0;i < n;i++) {
			bucket[a[i]/p%10].push_back(a[i]);
		}
		int num = 0;
		for(int digit = 0;digit < 10;digit++) {
			for(int i = 0;i < (int)bucket[digit].size();i++) {
				a[num++] = bucket[digit][i];
			}
			bucket[digit].clear();
		}
		p *= 10;
	}
}


void lsdRadixSort() {
	for(int k = 0;k < 4;k++) {
		for(int i = 0;i < n;i++) {
			bucket[a[i]>>(8*k) & 255].push_back(a[i]);
		}
		int num = 0;
		for(int digit = 0;digit < base;digit++) {
			for(int i = 0;i < (int)bucket[digit].size();i++) {
				a[num++] = bucket[digit][i];
			}
			bucket[digit].clear();
		}
	}
}

void readData() {
	 for(int i = 0;i < n;i++) {
		 scanf("%d",&a[i]);
	 }
}

void printData() {
	for(int i = 0;i < n;i++) {
		printf("%d ",a[i]);
	}
	printf("\n");
}

/*
void testSort() {
	double start, stop;
	generateData();
	memcpy(b,a,sizeof(a));
	start = clock();
	lsdRadixSort();
	stop = clock();
	printf("radix sort : %.5lf\n",(stop - start)/CLOCKS_PER_SEC);
	start = clock();
	sort(b,b + n);
	stop = clock();
	printf("stl sort : %.5lf\n",(stop - start)/CLOCKS_PER_SEC);
	
}
*/

int main()
{
	freopen("algsort.in","r",stdin);
	freopen("algsort.out","w",stdout);
	readData();
	lsdRadixSort();
	printData();
	return 0;
}