Cod sursa(job #3030994)

Utilizator Razvan2699Mircea Andrei Razvan Razvan2699 Data 18 martie 2023 10:53:14
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.03 kb
#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;
}