Cod sursa(job #2900156)

Utilizator StanCatalinStanCatalin StanCatalin Data 10 mai 2022 14:42:25
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stdlib.h>
#include <time.h>

using namespace std;

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

const int dim = 500005;

int vec[dim];
int n;

void MergeSort(int *vec, int n) {
    if (n <= 1) return;
    int *vec1, *vec2;
    vec1 = vec;
    int a_n = n/2;
    vec2 = vec + n/2;
    int b_n = n - n/2;
    MergeSort(vec1, a_n);
    MergeSort(vec2, b_n);
    int i = 0;
    int j = 0;
    vector<int> newvec;
    while (i < a_n && j < b_n) {
        if (vec1[i] <= vec2[j]) {
            newvec.push_back(vec1[i++]);
        } else {
            newvec.push_back(vec2[j++]);
        }
    }
    while (i < a_n) {
        newvec.push_back(vec1[i++]);
    }
    while (j < b_n) {
        newvec.push_back(vec2[j++]);
    }
    int cnt = 0;
    for (auto &y:newvec) {
        vec[cnt++] = y;
    }
}

int Partition(int *vec, int st, int dr) {
    int index = rand()%(dr - st) + st;
    int pivot = vec[index];
    cout << st << " " << dr << " " << index << " " << pivot << "\n";
    for (int i=0; i<dr; i++) {
        cout << vec[i] << " ";
    }
    cout << "\n";
    swap(vec[index], vec[dr-1]);
    int i = st;
    for (int j=st; j<dr; j++) {
        if (vec[j] < pivot) {
            swap(vec[i], vec[j]);
            i++;
        }
    }
    swap(vec[i], vec[dr-1]);
    for (int i=0; i<dr; i++) {
        cout << vec[i] << " ";
    }
    cout << "\n\n\n";
    return index;
}

void QuickSort(int *vec, int st, int dr){
    if (st < dr) {
        int index = Partition(vec, st, dr);
        QuickSort(vec, st, index);
        QuickSort(vec, index+1, dr);
    }
}

int main()
{
    srand(time(NULL));
    in >> n;
    for (int i=0; i<n; i++) {
        in >> vec[i];
    }
    QuickSort(vec, 0, n);
    for (int i=0; i<n; i++) {

        out << vec[i] << " ";
    }
    return 0;
}