Cod sursa(job #2706800)

Utilizator vnedelcuVictor Andrei Nedelcu vnedelcu Data 15 februarie 2021 20:16:04
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <stdio.h>
#include <vector>
#include <stdlib.h>

using namespace std;

void quicksort(vector<int> & arr, int left, int right) {
    if (left >= right) {
        return;
    }

    int rand_index = left + rand() % (right - left + 1);
    swap(arr[left], arr[rand_index]);

    int pivot = arr[left];
    int less_pos = left; // [left, less_pos) < pivot
    int equal_pos = left; // [less_pos, equal_pos) = pivot
    int arr_pos = right; // [equal_pos, right] > pivot

    while (equal_pos <= arr_pos) {
        if (arr[equal_pos] < pivot) {
            swap(arr[equal_pos], arr[less_pos]);
            equal_pos++;
            less_pos++;
        } else if (arr[equal_pos] > pivot) {
            swap(arr[equal_pos], arr[arr_pos]);
            arr_pos--;
        } else {
            equal_pos++;
        }
    }

    quicksort(arr, left, less_pos - 1);
    quicksort(arr, equal_pos, right);
}

int main() {
    FILE * f;

    f = fopen("algsort.in", "r");
    int n;
    fscanf(f, "%d", &n);

    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        fscanf(f, "%d", &arr[i]);
    }
    fclose(f);

    quicksort(arr, 0, n - 1);

    f = fopen("algsort.out", "w");
    for (int i = 0; i < n; i++) {
        fprintf(f, "%d ", arr[i]);
    }
    fclose(f);

    return 0;
}