Cod sursa(job #3030797)

Utilizator RobertJmekRobert RobertJmek Data 17 martie 2023 21:22:25
Problema Sortare prin comparare Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.75 kb
#include<iostream>
#include<time.h>
#include<unistd.h>
#include<fstream>
using namespace std;

ifstream f("algsort.in");
ofstream g("algsort.out");

//// Radix baza 10:

int max(int vec[], int n)
{
    int nrMax=vec[0];
    for( int i = 1; i < n; i++ )
    {
        if ( vec[i] > nrMax )
            nrMax = vec[i];
    }

    return nrMax;
}

void Countsort(int vec[], int n, int digit)

{
    int finalvec[n];
    int i, count[10] = {0};
    for ( i = 0; i < n; i++)
    {
        count[(vec[i] / digit) % 10]++;
    }
    for ( i = 1; i < 10; i++ )
    {
        count[i] += count[i - 1];
    }
    for ( i = n - 1; i >= 0; i-- )
    {
        finalvec[count[(vec[i] / digit ) % 10] - 1 ] = vec[i];
        count[(vec[i] / digit) % 10 ]--;
    }
    for ( i = 0; i < n; i++)
        vec[i] = finalvec[i];
}

void radix( int vec[], int n)


{
    int ma=max(vec, n);
    for ( int digit = 1; ma / digit > 0; digit *= 10 )
        Countsort(vec,n,digit);
}

/// Merge sort:

void merge(int v[], int st, int mij, int dr)
{
    int lminiv_1 = mij - st + 1;
    int lminiv_2 = dr - mij;

    int miniv_1[lminiv_1];
    int miniv_2[lminiv_2];

    for( int i=0; i < lminiv_1; i++)
        miniv_1[i] = v[st + i];
    for ( int i=0; i < lminiv_2; i++)
        miniv_2[i] = v[mij + 1 + i];
    
    int index_1 = 0;
    int index_2 = 0;

    int index_t = st;


    while( index_1 < lminiv_1 && index_2 < lminiv_2 )
    {
        if ( miniv_1[index_1] <= miniv_2[index_2] )
        {   v[index_t] = miniv_1[index_1];
            index_1++;
        }
        else 
        {
            v[index_t] = miniv_2[index_2];
            index_2++;
        }
        index_t++;
    }
    while ( index_1 < lminiv_1 )
    {
        v[index_t] = miniv_1[index_1];
        index_1++;
        index_t++;
    }
    while ( index_2 < lminiv_2 )
    {
        v[index_t] = miniv_2[index_2];
        index_2++;
        index_t++;
    }
}

void MergeSort ( int v[], int start, int stop)
{
    if ( start >= stop)
        return;

    auto mid = start + ( stop - start) / 2;
    MergeSort(v,start,mid);
    MergeSort(v, mid + 1, stop);
    merge(v,start,mid,stop);


}

/// Insertion sort:

void insertion(int v[],int n)
{
    int key=0,i,j;
    for ( i=1; i<n; i++ )
        {
            key = v[i];
            j = i - 1;
            while ( j >= 0 && v[j] > key)
            {
                v[ j + 1] = v[j];
                j--;

            }
            v[j+1] = key;
        }   
}

/// Shelsortv:

void shellSort(int arr[], int n)
{
    for (int gap = n/2; gap > 0; gap /= 2)
    {
        for (int i = gap; i < n; i += 1)
        {
            int temp = arr[i];
            int j;            
            for (j = i; j >= gap && arr[j - gap] > temp; j -= gap)
                arr[j] = arr[j - gap];
              
            arr[j] = temp;
        }
    }
}

//  Countsort:

void countsort(int v[],int n)
{
    int maxe;
    int j=0;
    maxe = max(v,n);
    int count[maxe+1]={0};
    for ( int i=0; i < n; i++ )
    {
        count[v[i]] ++;
    }
    for ( int i=0; i <= maxe; i++ )
    {
        while ( count[i] != 0)
        {
            v[j] = i;
            j++;
            count[i] --;
        }
    }


}

/// Test sortare:

bool sort_test(int vec[],int n)
{   
    bool ok=true;
    for ( int i=0; i < n-1; i++ )
    {
        if ( vec[i+1] < vec[i] )
        {    ok = false;
            cout<<vec[i+1]<<' ';
    }}
    return ok;
}


/// Afisare vector:

void afisare_v(int v[],int n)
{
    for ( int i=0; i < n; i++)
        cout << v[i] << " ";
}

int main()
{   
    int n;
    f >> n;
    int v[n+1]={0};
    for ( int i=0; i<n; i++ )
        f >> v[i];


///    MergeSort(v,0,n-1);
///       radix(v,n);
 ////     insertion(v,n);
///    shellSort(v,n);
    countsort(v,n);
    for ( int i=0; i<n; i++ )
        g << v[i] << " ";

}