Cod sursa(job #2953036)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 10 decembrie 2022 13:18:10
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <cstdio>
#include <climits>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <bitset>
#include <map>
#include <cstring>
#include <algorithm>
#define NMAX 2003
#define MOD 1000000007
using namespace std;

int n;
queue<int> bucket[10];

FILE* fin, * fout;



int main()
{
	fin = fopen("algsort.in", "r");
	fout = fopen("algsort.out", "w");


	fscanf(fin, "%d", &n);
	
	for (int i = 1; i <= n; i++)
	{
		int x;
		fscanf(fin, "%d", &x);
		bucket[x % 10].push(x);
	}

	//fac un counting sort pe astea
	//Practic fac mereu o sortare dupa cifra de pe pozitia x/p 
	//Si pun sortarile astea un bucket-uri
	//Dar e important cand imi refac vectorul sa imi scot elementele
	//in aceeasi ordine in care le-am bagat
	//Pentru ca asa se pastreaza sortate in bucket
	long long int p = 10;
	while (1)
	{
		//imi refac vectorul initial 
		vector<int>sortat;
		for (int i = 0; i <= 9; i++)
		{
			while (!bucket[i].empty())
			{
				sortat.push_back(bucket[i].front());
				bucket[i].pop();
			}
		}
		//acuma sortez frumos dupa urmatoarea cifra semnificativa
		bool amMaiMare = false;
		for (int i = 0; i < sortat.size(); i++)
		{
			int poz = (sortat[i] / p) % 10;
			if (sortat[i] > p)
			{
				amMaiMare = true;
			}
			bucket[poz].push(sortat[i]);
		}
		if (!amMaiMare)
		{
			//am terminat, ma opresc
			break;
		}
		p = p * 10;
	}

	vector<int>sortat;
	for (int i = 0; i <= 9; i++)
	{
		while (!bucket[i].empty())
		{
			sortat.push_back(bucket[i].front());
			bucket[i].pop();
		}
	}
	for (int i = 0; i < sortat.size(); i++)
	{
		fprintf(fout, "%d ", sortat[i]);
	}
	return 0;
}