Cod sursa(job #1011977)

Utilizator bghimisFMI Ghimis Bogdan bghimis Data 17 octombrie 2013 20:27:31
Problema Sortare prin comparare Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
using namespace std;

int nrCifre (int n)
{
  int cnt = 0;
  while (n != 0)
    {
      cnt++;
      n /= 10;
    }

  return cnt;
}

int nrZece (int n)
{
  n++;
  
  int p = 1;
  for (int i = 0; i < n; i++)
    p *= 10;
  
  return p;
}

void swap (int *v, int i, int j)
{
  int tmp = v[i];
  v[i] = v[j];
  v[j] = tmp;
}

int faRost(int n, int i)
{
  if (i == 0) return n % 10;
  if (i > 0)
    while (i--)
      n = n / 10;
  return n % 10;
}

void radixSort (int *v, int n)
{
  // Nr maxim de cifre
  int maxim = nrCifre(v[0]);
  for (int i = 1; i < n; i++)
    if (maxim < nrCifre(v[i]))
      maxim = nrCifre(v[i]);

  for (int i = 0; i != maxim; i++)
    {
      // Vectorul de frecventa al cifrelor
      int frecventa[10] = {0};
      for (int k = 0; k < n; k++)
	frecventa[faRost(v[k], i)]++;
      
      // cout << "NR ZECE = " << nrZece(i) << endl;
      // for (int k = 0; k < 10; k++)
      //  cout << " k = " << k << " frecv: " << frecventa[k] << endl;
      
      int cnt = 0;
	  for (int l = 0; l < 10; l++) 
	    for (int k = 0; k < n; k++)
	      {
		if (faRost(v[k], i) == l)
		  {
		    // cout << "LOLOLOL L-am gasit pe " << v[k] << " pe pozitia " << k << " iar ultima cifra e " << l << " contorul e  " << cnt << " si il mut pe " << cnt << endl;
		    swap(v, k, cnt++);
		frecventa[l]--;
		  }
	      }
	  
	  //for(int k = 0; k < n; k++)
            //cout << k << " -> " << v[k] << endl;
    }
  
}

int main()
{
  ifstream cin("algsort.in");
  ofstream cout("algsort.out");

  int n; cin >> n;
  int v[500001];
  for(int i = 0; i < n; i++)
    cin >> v[i];
  
  radixSort(v, n);

  for(int i = 0; i < n; i++)
    cout << v[i] << " ";
  
  cin.close();
  cout.close();

  return 0;
}