Cod sursa(job #1525720)

Utilizator stoianmihailStoian Mihail stoianmihail Data 15 noiembrie 2015 14:40:14
Problema Sortare prin comparare Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.31 kb
#include <stdio.h>

#define Nadejde 500000
#define Smerenie 30

typedef struct {
  int b, e;
} cell;

int N, ss;
int val[Nadejde];
cell stack[Smerenie];

/** Pune pe stiva intervalul (b, e). **/
void push(int b, int e) {
  stack[ss].b = b;
  stack[ss++].e = e;
}

/** Arunca varful stivei. **/
void pop(int *b, int *e) {
  (*b) = stack[--ss].b;
  (*e) = stack[ss].e;
}

/** Sorteaza cu quickSort iterativ. **/
void sort(int begin, int end) {
  int b, e, tmp, pivot;
  push(begin, end);
  while (ss) {
    pop(&begin, &end);
    b = begin, e = end;
    pivot = val[(b + e) >> 1];
    while (b <= e) {
      while (val[b] < pivot) {
        b++;
      }
      while (val[e] > pivot) {
        e--;
      }
      if (b <= e) {
        tmp = val[b];
        val[b++] = val[e];
        val[e--] = tmp;
      }
    }
    if (begin < e) {
      push(begin, e);
    }
    if (b < end) {
      push(b, end);
    }
  }
}

int main(void) {
  int i;
  FILE *f = fopen("algsort.in", "r");

  fscanf(f, "%d", &N);
  for (i = 0; i < N; i++) {
    fscanf(f, "%d", &val[i]);
  }
  fclose(f);

  f = fopen("algsort.out", "w");

  sort(0, N - 1);
  for (i = 0; i < N; i++) {
    fprintf(f, "%d ", val[i]);
  }
  fclose(f);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}