Cod sursa(job #2914138)

Utilizator Dennis_SoareDennis Soare Dennis_Soare Data 18 iulie 2022 22:56:10
Problema Sortare prin comparare Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.3 kb
#include <bits/stdc++.h>

using namespace std;


void bubble_sort(vector<int>& v, int n) 
{ 
    int i, j; 
    for (i = 0; i < n - 1; i++) 
        for (j = 0; j < n - i - 1; j++) 
            if (v[j] > v[j + 1]) 
                swap(v[j], v[j + 1]); 
} 


void merge(vector<int> &v, int l, int m, int r){

    int i = l, j = m + 1, k = 0;
    vector<int> c(r-l+1);

    ///interclasare
    while(i <= m && j <= r) {

        if(v[i]<=v[j])
            c[k]=v[i++];
        else
            c[k]=v[j++];
        k++;
    }

    while(i<=m)
        c[k++]=v[i++];

    while(j<=r)
        c[k++]=v[j++];

    for (i = l, k = 0; i <= r; i++, k++)
        v[i] = c[k];
    c.clear();
}

void merge_sort(vector<int> &v, int l, int r) {

    if (l < r) {
        int m = l+(r-l)/2;
        merge_sort(v, l, m);
        merge_sort(v, m+1, r);

        merge(v, l, m, r);
    }
}


int rand_between(int a, int b){
    int r = a + (rand() % ( b - a) );
        if(r<a || r>b) throw EXIT_FAILURE;
    return r;
}

int partition(vector<int> &arr, int l, int r){
    int pivot = rand_between(l, r);

    if(pivot!=r) swap(arr[pivot], arr[r]);
    int x = arr[r], i = (l - 1);
    for (int j = l; j <= r - 1; j++)
        if (arr[j] < x){
            i++;
            swap(arr[i], arr[j]);
        }
    swap(arr[i + 1], arr[r]);
    return (i + 1);
}

void quick_sort(vector<int> &arr, int l, int r){
    if(l>=r) return;
    int pi = partition(arr, l, r);

    quick_sort(arr, l, pi - 1);
    quick_sort(arr, pi + 1, r);
}

void count_sort(vector<int>&v, int nr_elem, int val_max) {

    vector<int> cnt(val_max+1, 0);

    for(auto &i:v)
        cnt[i]++;

    int x=0;
    for(int j = 0; j < (int)cnt.size(); j++)
        while(cnt[j]-- != 0)
            v[x++] = j;
}


void algsort_infoarena()
{
    ifstream in("algsort.in");
    ofstream out("algsort.out");

    int val_max = 0;
    int n;
    in >> n;
    vector<int> v(n);
    for(int i=0; i<n; i++) {
        in >> v[i];
        if(v[i] > val_max) {
            val_max = v[i];
        }
    }

    count_sort(v, n, val_max);

    for(int i=0; i<n; i++) {
        out << v[i]<< ' ';
    }

    in.close();
    out.close();
}

int main()
{
    algsort_infoarena();
    return 0;
}