Cod sursa(job #332104)

Utilizator mika17Mihai Alex Ionescu mika17 Data 16 iulie 2009 16:52:53
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 4.19 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>

/*
int partition(int *A,int le,int ri) {
    
    swap(A[le],A[le + rand() % (ri - le + 1)]);
    int p = A[le];
    while(le < ri) {
                
                while(A[ri] >= p && ri > le) --ri;
                A[le] = A[ri];
                while(A[le] <= p && le < ri) ++le;
                A[ri] = A[le];
    }
    A[le] = p;
    return le;
}
*/

/*
inline int max(int a,int b) {
       return a > b ? a : b;
}

int findpivot (int *a, int i, int j) {
int m, n, p;
m = rand() % (j - i + 1);
n = rand() % (j - i + 1);
p = rand() % (j - i + 1);
return (a[m] < a[n]) ? ((a[n] < a[p]) ? a[n] : max(a[m], a[p]))
: ((a[m] < a[p]) ? a[m] : max(a[n], a[p]));
}

void partition (int *a, int i, int j, int *pl, int *pr) {
int p, l = i, r = j;
p = a[(i + j)/2];
while (1) {
while (l <= j && a[l] <= p) l++;
while (r >= i && a[r] >= p) r--;
if (l < r) swap(a[l], a[r]);
else break;
}
*pl = l; *pr = r;
}

void quicksort (int *a, int i, int j) {
int l, r;
partition(a, i, j, &l, &r);
if (r > i) quicksort (a, i, r);
if (l < j) quicksort (a, l, j);
}
*/
/*

int partition(int *A,int le,int ri) {

    //for(int i=le;i<=ri;++i) printf("%d ",A[i]); printf("\n");
    int p = A[le]; //A[ le +  rand() % (ri - le + 1) ];
    int i = le,j = ri;
    while(true) {
                
                while(A[i] < p && i < ri) ++i;
                while(A[j] > p && j > le) --j;
                if(i < j) swap(A[i],A[j]), ++i,--j;
                 else { if(i == j) ++i, --j;
                        
                        //printf("deb: %d %d %d %d\n",le,j,i,ri);
                        //for(int i=le;i<=ri;++i) printf("%d ",A[i]); printf("\n");
                       return j; }
    } 
}
*/


void swap(int &a,int &b) {
     
     int aux = a; a = b; b = aux;
}

/*
int split(int *A,int le,int ri) { //eu returnez J deci tre sa am grija la primul element
                                  //daca returnam I trebuia sa am grija la ult element
    int p = A[ri];                //in cormen e invers pt ca sunt inversate ordinile while'urilor
    while(true) {
                
                while( A[le] < p ) ++le;
                while( A[ri] > p ) --ri;
                if(le < ri) swap(A[le++],A[ri--]);
                 else 
                  return le == ri ? --ri : ri;
    }
}


void qsortt(int *A,int le,int ri) {
     
     if(le < ri) { 
      for(int i=le;i<=ri;++i) printf("%d ",A[i]); printf("\n");
           int q = split(A,le,ri); printf("deb: %d %d %d\n",le,q,ri);
      for(int i=le;i<=ri;++i) printf("%d ",A[i]); printf("\n");
           qsortt(A,le,q - 1);  //nu mere cu un singur q pt ca tre luati aman2 i,j
           qsortt(A,q + 1,ri);
     }
}*/



void qsort(int *A,int le,int ri) {
     //for(int i=le;i<=ri;++i) printf("%d ",A[i]); printf("\n");
     if(le < ri) {
           int p = A[le + rand() % (ri - le + 1)], i = le - 1, j = ri + 1;
     
           while(true) {
                 do ++i; while(A[i] < p); //tre luati si pivotii altfel pot ramane aiurea plasati
                 do --j; while(A[j] > p);
                 if(i < j) swap(A[i],A[j]);
                  else { if(i == j) ++i,--j; break; } //poa sa fie |i - j| = 1 sau 2 (poz pivot)
           }                                          //poa sa fie 2 pivoti in ult iteratie, at se
                                                      // comporta normal
           //printf("piv = %d  deb le  = %d j = %d i = %d ri = %d\n",p,le,j,i,ri);
           //for(int i=le;i<=ri;++i) printf("%d ",A[i]); printf("\n");
           qsort(A,le,j);
           qsort(A,i,ri);
     }
}

int main() {
    
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    
    
    //int x; scanf("%d",&x); 
    //while(x--) {
    
    int *A,N;
    scanf("%d",&N);
    
    A = (int*)calloc(N,sizeof(int));
    
    for(int i=0;i<N;++i) scanf("%d",&A[i]);
    
    qsort(A,0,N - 1);
    //int a; int b;
    //partition(A,0, N - 1,&a,&b);
    //partition(A,0,N-1);
    //quickSort(A,0,N-1);
    
    for(int i=0;i<N;++i) printf("%d ",A[i]); 
    //printf("\n\n\n");}
    
    return 0;
}