Cod sursa(job #507319)

Utilizator c_sebiSebastian Crisan c_sebi Data 5 decembrie 2010 19:36:18
Problema Sortare prin comparare Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <algorithm>

#define KMAX 750000

using namespace std;

int a[500001];
int c[KMAX];
int b[KMAX];
int n;

void insertion(int l, int r){
    int i, j, v;
    for(i = l + 1; i <= r; i++){
        v = a[i];
        j = i - 1;
        while(j >= l && a[j] > v) {a[j+1] = a[j]; j--;}
        a[j+1] = v;
    }

}

int Partition(int l, int r)
{

    	int x = a[(l+r)>>1], aux;
	int i = l, j = r;
	while(i <= j){
        while(a[i] < x) i++;
        while(a[j] > x) j--;
        if(i <= j) { aux = a[i]; a[i] = a[j]; a[j] = aux; i++; j--; }
	}

	return j;
}

void count(){
    int i, j;
    for(i = 1; i <= n; i++)
        c[a[i]]++;
    b[0] = c[0];
    for(i = 1; i < KMAX; i++){
        c[i] += c[i-1];
        b[i] = c[i];
    }
    for(i = n; i > 0; ){
        while(c[a[i]] != i){
            j = a[i];
            swap(a[i], a[c[a[i]]]);
            c[j]--;
        }
        i--;
        while(i > 0 && (c[a[i]] < (a[i] ? b[a[i]-1]+1 : 1) || i <= b[a[i]]))
            i--;
    }
}


void quick(int l, int r){

    if(r - l > 0){

        int q = Partition(l, r);
        quick(l, q);
        quick(q+1, r);
    }
    //else insertion(l, r);
}

int main(){
    ifstream f("algsort.in");
    ofstream g("algsort.out");
    int i = 0;
    f>>n;
    for(i = 1; i <= n; i++)
        f>>a[i];
    count();
    for(i = 1; i <= n; i++)
        g<<a[i]<<" ";
    return 0;
}