Cod sursa(job #2442761)

Utilizator CiobaCatalinCioba Catalin CiobaCatalin Data 25 iulie 2019 11:23:08
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.97 kb
#include <fstream>
#include <iostream>
#include <algorithm>

using namespace std;

void swap(int * arr, int l, int r)
{
    int tmp = arr[l];
    arr[l] = arr[r];
    arr[r] = tmp;
}

int partition(int * arr, int start, int end)
{
    int pivot = arr[start];
    int idx = start + 1;

    for (int i = start + 1; i <= end; i++)
    {
        if (arr[i] < pivot) {
            swap(arr, idx++, i);
        }
    }

    swap(arr, idx - 1, start);

    return idx - 1;
}

void quicksort(int * arr, int start, int end)
{
    if (start < end) {
        int pivot = partition(arr, start, end);

        quicksort(arr, start, pivot - 1);
        quicksort(arr, pivot + 1, end);
    }
}

void mergesort(int * arr, int start, int end)
{
    if (start == end)
        return;

    int mid = (start + end) / 2;

    mergesort(arr, start, mid);
    mergesort(arr, mid + 1, end);

    int * buff = new int[end - start + 1];

    int i, j, k;
    i = start;
    j = mid + 1;
    k = 0;

    while (i <= mid && j <= end)
    {
        if (arr[i] < arr[j]) 
        {
            buff[k++] = arr[i++];
        }
        else
        {
            buff[k++] = arr[j++];
        }
    }
    
    while (i <= mid)
    {
        buff[k++] = arr[i++];
    }

    while (j <= end)
    {
        buff[k++] = arr[j++];
    }

    for (int idx = 0; idx < end - start + 1; idx++) 
    {
        arr[start + idx] = buff[idx];
    }
}

int main() 
{
//    ifstream fin("algsort.in");
//    ofstream fout("algsort.out");

    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);

    int n;
    scanf("%d", &n);
    //fin >> n;

    int *arr = new int[n];

    for (int i = 0; i < n; i++) 
    {
        scanf("%d", &arr[i]);
        //fin >> arr[i];
    }

//    random_shuffle(arr, arr + n);
//    quicksort(arr, 0, n - 1);
    mergesort(arr, 0, n - 1);

    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
        //fout << arr[i] << " ";
    }

//    fin.close();
//    fout.close();

    return 0;
}