Cod sursa(job #2680649)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 3 decembrie 2020 20:42:34
Problema Sortare prin comparare Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.47 kb
//#include <stdio.h>
//#include <stdlib.h>
//
//int v[500000],id[100000],aux[5000000];
//
//void buckets(int st, int dr, int imp){
//  int i,j;
//  if(imp>=1){
//    j=0;
//    for(i=st;i<=dr;i++){
//      if(v[i]/imp+1>j)
//        j=v[i]/imp+1;
//    }
//    for(i=0;i<=j;i++)
//      id[i]=0;
//    for(i=st;i<=dr;i++){
//      id[v[i]/imp+1]++;
//    }
//
//    id[0]+=st;
//    for(i=1;i<=j;i++){
//      id[i]+=id[i-1];
//    }
//
//    for(i=st;i<=dr;i++){
//      aux[id[v[i]/imp]]=v[i];
//      id[v[i]/imp]++;
//    }
//
//    for(i=st;i<=dr;i++){
//      v[i]=aux[i];
//      aux[i]=0;
//    }
//
//    i=0;
//    buckets(st,id[0]-1,imp/10);
//    while(i<j-1){
//      buckets(id[i],id[i+1]-1,imp/10);
//    }
//  }
//}
//
//int main(){
//  int n,i,imp;
//  FILE *fin, *fout;
//  fin=fopen("algsort.in","r");
//  fscanf(fin,"%d",&n);
//  for(i=0;i<n;i++){
//    fscanf(fin,"%d",&v[i]);
//  }
//  fclose(fin);
//
//  buckets(0,n-1,100);
//
//  fout=fopen("algsort.out","w");
//  for(i=0;i<n;i++)
//    fprintf(fout,"%d ",v[i]);
//  fclose(fout);
//  return 0;
//}

#include <stdio.h>
#include <stdlib.h>

int v[500000],id[100000],aux[5000000];

void quicksort(int begin, int end){
  int b=begin,e=end,pivot=v[(begin+end)/2],aux;

  while(v[b]<pivot)
    b++;
  while(v[e]>pivot)
    e--;

  while(b<e){
    aux=v[b];
    v[b]=v[e];
    v[e]=aux;

    do{
      b++;
    } while(v[b]<pivot);
    do{
      e--;
    }while(v[e]>pivot);
  }

  if(e>begin)
    quicksort(begin,e);
  if(e+1<end)
    quicksort(e+1,end);
}

int main(){
  int n,i,val,j;
  FILE *fin, *fout;
  fin=fopen("algsort.in","r");
  fscanf(fin,"%d",&n);
  for(i=0;i<n;i++){
    fscanf(fin,"%d",&v[i]);
    v[i]--;
  }
  fclose(fin);

  val=1<<30; ///Pun intai in 4 bucket-uri de cate 2^30 elemente fiecare si apoi sortez cu quicksort.
  ///Oricum m-ati rugat sa implementez sii quicksort...

    j=0;
    for(i=0;i<n;i++){
      id[v[i]/val+1]++;
      if(v[i]/val+1>j)
        j=v[i]/val+1;
    }

    for(i=1;i<=j;i++){
      id[i]+=id[i-1];
    }

    for(i=0;i<n;i++){
      aux[id[v[i]/val]]=v[i];
      id[v[i]/val]++;
    }

    for(i=0;i<n;i++){
      v[i]=aux[i];
      aux[i]=0;
    }

    i=0;
    quicksort(0,id[0]-1);
    while(i<j-1){
      quicksort(id[i],id[i+1]-1);
      i++;
    }

  fout=fopen("algsort.out","w");
  for(i=0;i<n;i++)
    fprintf(fout,"%d ",v[i]+1);
  fclose(fout);
  return 0;
}