Cod sursa(job #1273689)

Utilizator catalincraciunCraciun Catalin catalincraciun Data 22 noiembrie 2014 21:13:42
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
/// Craciun Catalin
///  Algsort
#include <iostream>
#include <fstream>
#include <algorithm>

#define NMax 500005

using namespace std;

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

int n;
int C[NMax];
int B[NMax];

void quicksort(int inf,int sup)
{
  int x,i,j,t;
  i=inf;
  j=sup;
  x=C[(i+j)/2];
  do {
    while ((i<sup)&&(C[i]<x)) i++;
    while ((j>inf)&&(C[j]>x)) j--;
    if (i<=j) {
      t=C[i];
      C[i]=C[j];
      C[j]=t;
      i++;
      j--;
    }
  } while (i<=j);
  if (inf<j) quicksort(inf,j);
  if (i<sup) quicksort(i,sup);
}

void mergeS(int left, int right) {

    int index = 1;
    int indexLeft = left;
    int indexRight = (left+right)/2+1;
    while (indexLeft <= (left+right)/2 && indexRight <= right) {
        if (C[indexLeft] < C[indexRight]) {
            B[index] = C[indexLeft];
            indexLeft++;
            index++;
        } else {
            B[index] = C[indexRight];
            indexRight++;
            index++;
        }
    }
    while (indexLeft <= (left+right)/2) {
        B[index] = C[indexLeft];
        indexLeft++;
        index++;
    }
    while (indexRight <= right) {
        B[index] = C[indexRight];
        indexRight++;
        index++;
    }

    int pos = 1;
    for (int i=left;i<=right;i++, pos++) {
        C[i] = B[pos];
    }
}

void divide(int left, int right) {

    if (left < right) {
        int mij = (left + right)/2;
        divide(left, mij);
        divide(mij+1, right);
        mergeS(left, right);
    }
}

void read() {

    f>>n;
    for (int i=1;i<=n;i++)
        f>>C[i];
}

void output() {

    f>>n;
    for (int i=1;i<=n;i++)
        g<<C[i]<<' ';
}

int main() {

    read();
    quicksort(1,n);
    output();

    f.close(); g.close();
    return 0;
}