Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <fcntl.h>
- #include <sys/syscall.h>
- //Tamanho do vetor
- #define MAXN 100005
- //Maior elemento permitido
- #define AMAX 100005
- int cnt[AMAX], arr[MAXN], n;
- //Função para calcular o numero de bytes de um numero (log10..)
- int logdez(int x){
- int ans = 0;
- while(x){
- ans++;
- x /= 10;
- }
- return ans;
- }
- void count(int l, int r, int v){
- int i, fd;
- //array auxiliar para o counting sort
- int ord[(n >> 1)+1];
- // nome do arquivo e string para printar no arquivo, respectivamente
- char nome[8], x[10];
- //Nome do arquivo que vai ser criado para salvar o resultado
- sprintf(nome, "FP%d.txt", v);
- //COUNTING SORT
- for(i = l; i < r; i++) cnt[ arr[i] ]++;
- for(i = 1; i < AMAX; i++) cnt[i] += cnt[i - 1];
- for(i = l; i < r; i++) ord[ --cnt[ arr[i] ] ] = arr[i];
- //Caso ja exista um arquivo de uma execução passada
- remove(nome);
- //Criaçao do arquivo
- fd = open(nome, O_CREAT | O_TRUNC | O_APPEND | O_RDWR , S_IRWXU );
- //Printamos o resultado no arquivo de texto para ser usado futuramente
- r = r - l;
- for(i = 0 ; i < r; i++){
- sprintf(x, "%d ", ord[i]);
- write(fd, x, logdez(ord[i]) + 1);
- }
- close(fd);
- }
- int main(){
- //freopen("input.txt", "r", stdin);
- //freopen("output.txt", "w", stdout);
- int i;
- //Entrada dos dados
- scanf("%d", &n);
- for(i = 0; i < n; i++){
- scanf("%d", arr + i);
- }
- int p = fork();
- // p == 0 ? processo filho : processo original
- if(!p){
- //Counting sort na primeira metade
- count(0, n >> 1, 0);
- exit(1);
- } else {
- //counting sort na segunda metade
- count(n >> 1, n, 1);
- }
- //Arrays para guardar os dados lidos dos arquivos de texto
- int fp[MAXN], fs[MAXN];
- //LEITURA DOS DADOS
- freopen("FP0.txt", "r", stdin);
- int l, r;
- for(l = 0, r = n >> 1; l < r; l++){
- scanf("%d ", fp + l);
- }
- freopen("FP1.txt", "r", stdin);
- int a, b;
- for(a = 0, b = r + (n & 1) ; a < b; a++){
- scanf("%d ", fs + a);
- }
- a = l = 0;
- //Duas sequencias ordenadas, podemos juntar as duas em uma unica sequencia ordenada em O(n). (merge)
- while(a < b && l < r){
- if(fp[l] < fs[a]) printf("%d ", fp[l++]);
- else printf("%d ", fs[a++]);
- }
- while(a < b) printf("%d ", fs[a++]);
- while(l < r) printf("%d ", fp[l++]);
- putchar('\n');
- exit(1);
- }
Add Comment
Please, Sign In to add comment