#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

int cmp_int(void *a)
{
    return ( ((int *)a)[0] > ((int *)a)[1] );
}

int cmp_float(void *a)
{
    return ( ((float *)a)[0] > ((float *)a)[1] );
}




void bubble(void *arr, size_t elSize, size_t arSize, int(*cmp)(void *))
{
    char swapped;
    void *i = arr;
    void *yoba = ((char *)arr) + arSize - elSize; // vot tak
    void *tmp = alloca(elSize);
    //printf("\n\n----\narSize: %i \n----\n\n", arSize/elSize);
    do
    {
        swapped = 0;
        for (i = arr; i != yoba ; i = ((char *)i) + elSize )
        {
            if( cmp( i ))
            {
                memcpy(tmp                  , i                   , elSize); // kopiruem vo vremennuiu pamyat
                memcpy(i                    , ((char *)i) + elSize, elSize); // sledujushee v predidushee
                memcpy( ((char *)i) + elSize, tmp                 , elSize); // iz vremennoy v sledujushee
                swapped = 1;
            }
        }
        
    } while (swapped != 0);
}

int main(int argc, char *argv[])
{
    int   a[] = {9, 8, 5, -4, 5, 1, -3, 0};
    float b[] = {0.16, -2745, 666.6666666, 14.88, 133.7, 267.234, 123.123, 0};
    int i;

for(i = 0; i < 8; i++)
    {
        printf("%i, ", a[i]);
    }
    printf("\n");
    
    bubble((void*)a, sizeof(int), sizeof(a), cmp_int);

    for(i = 0; i < 8; i++)
    {
        printf("%i, ", a[i]);
    }
    printf("\n-*-*-*-*-*-*-*-\n");
/////////////////////////////////////////////////////////////////////////////////////

    for(i = 0; i < 8; i++)
    {
        printf("%f, ", b[i]);
    }
    printf("\n");
    
    bubble((void*)b, sizeof(float), sizeof(b), cmp_float);

    for(i = 0; i < 8; i++)
    {
        printf("%f, ", b[i]);
    }


    
    return 0;
}