Cod sursa(job #2706940)

Utilizator vnedelcuVictor Andrei Nedelcu vnedelcu Data 16 februarie 2021 09:52:29
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 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 pos = left + 1;
    int pivot_pos = left + 1;
    while (pos <= right) {
        if (arr[pos] <= pivot) {
            swap(arr[pos], arr[pivot_pos]);
            pivot_pos++;
        }
        pos++;
    }
    pivot_pos--;
    arr[left] = arr[pivot_pos];
    arr[pivot_pos] = pivot;

    quicksort(arr, left, pivot_pos - 1);
    quicksort(arr, pivot_pos + 1, right);
}
*/

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 arr_pos = left;
    int less_pos = left;
    int greater_pos = right;

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

    quicksort(arr, left, less_pos - 1);
    quicksort(arr, greater_pos + 1, 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;
}