Pagini recente » Cod sursa (job #720179) | Cod sursa (job #1444728) | Cod sursa (job #865659) | Cod sursa (job #332565) | Cod sursa (job #658809)
Cod sursa(job #658809)
#include <stdio.h>
#define nmax 500000
#define BUF 100010
char buffer[BUF+4];
int poz=BUF-1;
FILE *fin;
void cit(int &n){
n=0;
poz++;
if(poz==BUF){
poz=0;
//citesc o noua linie
fread (buffer,sizeof(char),BUF,fin);
}
while(buffer[poz]>='0' && buffer[poz]<='9'){
n=n*10+(buffer[poz]-'0');
poz++;
if(poz==BUF){
poz=0;
//citesc o noua linie
fread (buffer,sizeof(char),BUF,fin);
}
}
}
void interclasare(int *v, int li1,int ls1, int li2, int ls2){
int rez[nmax],a=li1,b=li2,c=0;
while(a<=ls1 && b<=ls2){
if(v[a]<v[b]){
rez[c++]=v[a++];
}else{
rez[c++]=v[b++];
}
}
int i;
for(i=a;i<=ls1;i++)rez[c++]=v[i];
for(i=b;i<=ls2;i++)rez[c++]=v[i];
//copiez rez in v...
for(i=li1;i<=ls2;i++)
v[i]=rez[i-li1];
}
void merge(int *v, int li, int ls){
int k;
if(ls-li<2){
if(v[li]>v[ls]){
k=v[li];
v[li]=v[ls];
v[ls]=k;
}
}else
if(li<ls){
k=(li+ls)/2;
merge(v,li,k);
merge(v,k+1,ls);
interclasare(v,li,k,k+1,ls);
}
}
int main(){
int v[nmax],n;
fin=fopen("algsort.in","r");
cit(n);
int i;
for(i=0;i<n;i++){
cit(v[i]);
}
fclose(fin);
merge(v,0,n-1);
FILE *fout=fopen("algsort.out","w");
for(i=0;i<n;i++){
fprintf(fout,"%d ",v[i]);
}
fprintf(fout,"\n");
fclose(fout);
return 0;
}