Cod sursa(job #3252281)

Utilizator n6v26rDedu Razvan Matei n6v26r Data 29 octombrie 2024 00:00:58
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
// Quicksort cu pivotare hoare
#include <cstdlib>
#include <stdio.h>
#include <utility>

#define MAXN 500001

template <typename T>
void quickSort(T* arr, size_t size){
  auto findPivot = [](T* arr, size_t size) -> int {
    int PiPos = rand()%size;
    std::swap(arr[PiPos], arr[0]);

    T pi = arr[0];
    /*printf("pi: %d\n", pi);*/
    int i = 0;
    int j = size-1;
    while(i<j){

      while(arr[i]<pi)
        i++;

      while(arr[j]>pi)
        j--;

      if(i>=j){
        return j;
      }
      std::swap(arr[i], arr[j]);
      i++;
      j--;
    }
    return j;
  };

  int pivot = findPivot(arr, size);
  /*for(int i = 0; i<size; i++){*/
  /*  printf("%d ", arr[i]);*/
  /*}printf("\n[pivot]: %d\n\n", pivot);*/
  if(pivot!=0){
    quickSort(arr, pivot+1);
  }
  if(size-pivot-1>0)
    quickSort(arr+pivot+1, size-pivot-1);
}

int n;
int v[MAXN+1];

int main(){
  FILE *fin, *fout;
  fin = fopen("algsort.in", "r");
  fscanf(fin, "%d", &n);
  for(int i = 0; i<n; i++){
    fscanf(fin, "%d", &v[i]);
  }
  fclose(fin);

  quickSort(v, n);

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