#include <stdio.h>
#include <string.h>

void bubble_sort(int arr[], int tamanho) {
    int i, j;
    for (i = 0; i < tamanho - 1; i++) {
        for (j = 0; j < tamanho- i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp =  arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int comparador (void * a, void* b){
    return ( *(int*)a - *(int*)b );
}

int comparador_nomes(void * a, void* b){
    char **nome1 = (char**)a;
    char **nome2 = (char**)b;
    return strcmp(*nome1, *nome2);
}

void bubble_sort_generico(void *arr, int tamanho, int bytes_elem, int comparador(void*, void*) ){
    int i, j, tamanho_bytes = tamanho * bytes_elem;
    for (i = 0; i < tamanho_bytes - bytes_elem; i += bytes_elem) {
        for (j = 0; j < tamanho_bytes - i - bytes_elem; j += bytes_elem) {
            void *ptr_elem1 = arr + j;
            void *ptr_elem2 = arr + j + bytes_elem;

            if (comparador(ptr_elem1, ptr_elem2) > 0){
                char temp[1000];
                memcpy(temp, ptr_elem1, bytes_elem);
                memcpy(ptr_elem1, ptr_elem2, bytes_elem);
                memcpy(ptr_elem2, temp, bytes_elem);
            }
        }
    }
}


int main() {
    int nums[] = {37,2,59,1,19,3,14};
    int tamanho = sizeof(nums) / sizeof(nums[0]);
    bubble_sort_generico(nums, tamanho, sizeof(int), comparador);

    int i;
    for (i = 0;i < tamanho;++i){
        printf("%d ", nums[i]);
    }

    printf("\n\n");

    char *nomes[] = {"joao", "filipa", "rita", "ana", "marcos"};
    int tamanho2 = sizeof(nomes) / sizeof(nomes[0]);
    bubble_sort_generico(nomes, tamanho2, sizeof(char*) , comparador_nomes);

    for (i = 0;i < tamanho2 ;++i){
        printf("%s\n", nomes[i]);
    }

    return 0;
}
