#include <iostream>
#include<vector>
using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");
///INTERCHANGE----------------------------------------
void interchange(int v[],int n)
{
int i,j,aux;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(v[i]>v[j])
{
aux=v[i];
v[i]=v[j];
v[j]=aux;
}
}
///RADIX----------------------------------------------
int getMax(int v[], int n)
{
int maxx = v[0];
for (int i = 1; i < n; i++)
if (v[i] > maxx)
maxx = v[i];
return maxx;
}
void countSortRadix(int v[], int n, int exp)
{
int aux[n];
int i, digit[10];
for(i=0;i<=9;i++)
digit[i]=0;
for (i = 0; i <n; i++)
digit[(v[i] / exp) % 10]++;
for (i = 1; i < 10; i++)
digit[i] += digit[i - 1];
for (i = n - 1; i >= 0; i--) {
aux[digit[(v[i] / exp) % 10] - 1] = v[i];
digit[(v[i] / exp) % 10]--;
}
for (i = 0; i < n; i++)
v[i] = aux[i];
}
void radixSort(int v[], int n)
{
int m = getMax(v, n);
int exp=1;
while(m/exp>0){
countSortRadix(v,n,exp);
exp*=10;
}
}
///COUNT-----------------------------------------------
void countSort(int v[],int n)
{
int i;
int maxx=getMax(v,n);
int aux[maxx+1];
int temp[n];
///--------------------
for(i=0;i<n;i++)
temp[i]=0;
for(i=0;i<maxx+1;i++)
aux[i]=0;
///---------------------
for(i=0;i<n;i++)
aux[v[i]]++;
for(i=1;i<maxx+1;i++)
aux[i]+=aux[i-1];
for(i=0;i<n;i++)
{
temp[aux[v[i]]]=v[i];
aux[v[i]]--;
}
for(i=1;i<=n;i++)
v[i-1]=temp[i];
}
///SHELL----------------------------------------------
void shellSort(int v[], int n)
{
for (int dist=n/2; dist>0; dist/=2)
{
for (int i=dist;i<n;i++)
{
int temp=v[i],j;
for (j=i; j>=dist && v[j-dist]>temp; j-=dist)
v[j]=v[j-dist];
v[j]=temp;
}
}
}
///MERGE------------------------------------------------
int a[50003];
void mergeSort(int v[],int left,int right)
{
if (left<right)
{
int mid=(left+right)/2;
mergeSort(v,left,mid);
mergeSort(v,mid+1,right);
int i=left, j=mid+1,k=0;
while(i<=mid && j<=right)
{
if(v[i]<v[j])
a[++k]=v[i++];
else
a[++k]=v[j++];
}
while(i<=mid)
a[++k]=v[i++];
while(j<=right)
a[++k]=v[j++];
for(i=left,j=1;i<=right;i++,j++)
v[i]=a[j];
}
}
///AFISARE-----------------------------------------------
void afisare(int v[],int n)
{
for(int i=0;i<n;i++)
cout<<v[i]<<" ";
cout<<endl;
}
///COPY-ARRAY---------------------------------------------
void copiere(int v[],int t[],int n)
{
for(int i=0;i<n;i++)
t[i]=v[i];
}
int main()
{
long long n,i;
vector<int> v;
while(in>>x)
{
v.push_back(x);
}
n=v.size()
for(i=0;i<n;i++)
cin>>v[i];
cout<<"Inainte de sortare: ";
afisare(v,n);
copiere(v,t,n);
cout<<"Dupa interschimbare: ";
interchange(t,n);
afisare(t,n);
/*
cout<<"Inainte de sortare: ";
afisare(v,n);
copiere(v,t,n);
cout<<"Dupa Radix: ";
radixSort(t,n);
afisare(t,n);
cout<<"Inainte de sortare: ";
afisare(v,n);
copiere(v,t,n);
cout<<"Dupa shell: ";
shellSort(t,n);
afisare(t,n);
cout<<"Inainte de sortare: ";
afisare(v,n);
copiere(v,t,n);
cout<<"Dupa count: ";
countSort(t,n);
afisare(t,n);
cout<<"Inainte de sortare: ";
afisare(v,n);
copiere(v,t,n);
cout<<"Dupa merge: ";
mergeSort(t,0,n-1);
afisare(t,n);
*/
return 0;
}