Cod sursa(job #1489293)

Utilizator stoianmihailStoian Mihail stoianmihail Data 20 septembrie 2015 22:16:01
Problema Sortare prin comparare Scor 60
Compilator c Status done
Runda Arhiva educationala Marime 2.22 kb
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define Nadejde 1500000
#define MAX_LEVEL 20
#define Randomize -524289

int level;             // nivelul maxim din structura.
int bufPtr;            // primul slot nealocat.
int sl[Nadejde];       // zona de memorie prealocata.
int freq[Nadejde];     // frecventa numarului de pe pozitia "i".
int update[MAX_LEVEL]; // folosit in timpul inserarii.

/** Initializeaza structura. **/
void init() {
  /* Capul listei are valoarea -INF si MAX_LEVEL pointeri catre coada listei. */
  /* Coada listei are valoare INF si 0 pointeri. */
  sl[0] = -INT_MAX;
  sl[MAX_LEVEL + 1] = INT_MAX;

  int i;
  for (i = 1; i <= MAX_LEVEL; i++) {
    sl[i] = MAX_LEVEL + 1;
  }
  bufPtr = MAX_LEVEL + 2;
  level = 1;
}

/** Da-mi un nivel random. **/
int randomLevel() {
  int l = 1, r;
  for (l = 1, r = rand() & Randomize; r & 1; r >>= 1) {
    l++;
  }
  return l;
}

/** Insereaza valorea "x" in structura. **/
void insert(int x) {
  int l, pos = 0;
  for (l = level - 1; l >= 0; l--) {
    while (sl[sl[pos + l + 1]] < x) {
      pos = sl[pos + l + 1];
    }
    update[l] = pos;
  }
  pos = sl[pos + 1];

  if (sl[pos] != x) {
    int newLevel = randomLevel();
    if (newLevel > level) {
      for (l = level; l < newLevel; l++) {
        update[l] = 0;
      }
      level = newLevel;
    }

    sl[bufPtr] = x;
    freq[bufPtr]++;
    for (l = 0; l < newLevel; l++) {
      sl[bufPtr + l + 1] = sl[update[l] + l + 1];
      sl[update[l] + l + 1] = bufPtr;
    }
    bufPtr += newLevel + 1;
  } else {
    freq[pos]++;
  }
}

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

  init();
  srand(time(NULL));

  /* Citeste vectorul initial. */
  fscanf(f, "%d", &N);
  for (i = 0; i < N; i++) {
    fscanf(f, "%d", &val);
    insert(val);
  }
  fclose(f);

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

  /* Sorteaza folosind Skip-Lists. */
  int pos = sl[1];
  while (sl[pos] != INT_MAX) {
    for (i = 0; i < freq[pos]; i++) {
      fprintf(f, "%d ", sl[pos]);
    }
    pos = sl[pos + 1];
  }
  fputc('\n', f);
  fclose(f);

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