#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
int comparar(const void*, const void*);
void remover_duplicados(int16_t*, size_t);
void app_main() {
int16_t W[] = {5, 1, 2, 6, 4, 2, 3, 5, 4, 4};
size_t W_size = sizeof(W) / sizeof(int16_t);
// Mostrar el arreglo original
printf("Arreglo original: [");
for (uint8_t i = 0; i < (W_size-1); i++)
{
printf("%" PRId16 ", ", W[i]);
}
printf("%" PRId16 "]", W[W_size-1]);
printf("\n");
// Mostrar el arreglo ordenado
qsort(W, W_size, sizeof(int16_t), comparar);
printf("Arreglo ordenado: [");
for (uint8_t i = 0; i < (W_size-1); i++)
{
printf("%" PRId16 ", ", W[i]);
}
printf("%" PRId16 "]", W[W_size-1]);
printf("\n");
// Mostrar el con elementos duplicados eliminados
remover_duplicados(W, W_size);
printf("Arreglo sin duplicados: [");
for (uint8_t i = 0; i < (W_size-1); i++)
{
printf("%" PRId16 ", ", W[i]);
}
printf("%" PRId16 "]", W[W_size-1]);
fflush(stdout);
while (true) {
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
int comparar(const void *x, const void *y)
{
return (int) (*((int16_t*)x) - *((int16_t*)y));
}
void remover_duplicados(int16_t* arr, size_t size)
{
// Marcar como -1 los duplicados
for (uint8_t i = 0; i < size-1; i++)
{
int16_t curr = arr[i];
for (uint8_t j = i+1; j < size-1; j++)
{
if (curr != arr[j])
{
break;
}
arr[j] = -1;
}
}
// Recorrer el arreglo de acuerdo a la cantidad de -1s que haya
for (uint8_t i = 0, pos = 0; i < size; i++)
{
if (arr[i] == -1)
{
if (arr[pos] != -1)
pos = i;
}
else
{
if (arr[pos] == -1)
{
arr[pos++] = arr[i];
arr[i] = -1;
}
}
}
}