Cod sursa(job #2081489)

Utilizator MaligMamaliga cu smantana Malig Data 4 decembrie 2017 19:17:02
Problema Sortare prin comparare Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>
#include <string.h>

#define NMax (int)5e5 + 5

int N;
int v[NMax];

int comp(const void*,const void*);
void psort(void*,int,int,int(*comp)(void*,void*));
void swap(void*,void*);

int main()
{
    FILE *f = fopen("algsort.in","r");
    FILE *g = fopen("algsort.out","w");

    fscanf(f,"%d",&N);
    int i;
    for (i=1;i <= N;++i) {
        fscanf(f,"%d",v+i);
    }

    /*
    int a = 30, b = 2;
    swap(&a,&b);
    printf("a = %d\nb = %d",a,b);
    //*/

    psort(v+1,N,4,comp);

    for (i=1;i <= N;++i) {
        fprintf(g,"%d ",v[i]);
    }

    fclose(f);fclose(g);
    return 0;
}

void psort(void* v,int N,int sz,int(*comp)(void*,void*)) {
    int i,j;
    for (i=0;i < N;++i) {
        for (j=i+1;j < N;++j) {
            void *a = v + i*sz;
            void *d = v + j*sz;
            if (comp(a,d) > 0) {
                swap(a,d);
            }
        }
    }
}

int comp(const void *a,const void *b) {
    int x = *((int*)a);
    int y = *((int*)b);

    if (x < y) {
        return -1;
    }
    if (x > y) {
        return 1;
    }
    return 0;
}

void swap(void* a,void* b) {
    int *x = (int*)a;
    int *y = (int*)b;

    *x ^= *y ^= *x ^= *y;
}