#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* ma zwracac >0 jesli pierwszy element
   jest wiekszy, 0 jesli sa rowne
   i <0 jesli drugi jest wiekszy */
typedef int (*porownaj_t)(void*, void*);

void sort(void *tablica,
          int liczba_elementow,
		  int rozmiar_elementu,
          porownaj_t porownaj)
{
    int i,j;
    char *t;
    char tmp[4096];
    
    t = (char*) tablica;
    
    for (i=0; i<liczba_elementow; i++)
        for (j=0; j<liczba_elementow-1; j++) {
            if ( porownaj( t+j*rozmiar_elementu,
                           t+(j+1)*rozmiar_elementu
                         ) > 0) {
                memcpy(tmp,
                       t+j*rozmiar_elementu,
                       rozmiar_elementu);
                memcpy(t+j*rozmiar_elementu,
                       t+(j+1)*rozmiar_elementu,
                       rozmiar_elementu);
                memcpy(t+(j+1)*rozmiar_elementu,
                       tmp,
                       rozmiar_elementu);
                         
            }        
        }
}

int porownaj_liczby(void *l1, void *l2)
{
    int *li1, *li2;
    li1 = (int*) l1;
    li2 = (int*) l2;
    if (*li1 > *li2) return 1;
    else if (*li1 < *li2) return -1;
    else return 0;
}

int porownaj_lancuchy(void *l1, void *l2)
{
    char *la1, *la2;
    la1 = (char*) l1;
    la2 = (char*) l2;
    return strcmp(la1, la2);
}

int main()
{
    int tab1[] = { 3, 5, 2, 7, 9, 1, 1, 4 };
    char* tab2[] = {"Kasia", "Jola", "Beata", "Ala"};
    int i;
    
    for (i=0; i<8; i++) printf("%d\n",tab1[i]);
    for (i=0; i<4; i++) printf("%s\n",tab2[i]);

	sort(tab1, 8, sizeof(int), porownaj_liczby);
    sort(tab2, 4, sizeof(char*), porownaj_lancuchy);

	printf("\n\nPosortowane:\n");

    for (i=0; i<8; i++) printf("%d\n",tab1[i]);
    for (i=0; i<4; i++) printf("%s\n",tab2[i]);
    
    return 0;    
}


