Подсчитать число различных значений в массиве/Алгоритм си
Нужно * Подсчитать число различных значений в массиве* , как реализовать?Сначала думаю нужно отсортировать массив,а потом?А если будут числа одинаковые попадаться? :(
Ответы (1 шт):
Автор решения: Maggot
→ Ссылка
Как я и писал в коментарии используйте связку sort + uniq
Для сортровки возьмите базовый qsort - https://en.cppreference.com/w/c/algorithm/qsort
uniq - по отсортированному массиву написать просто берете базовый элемент и позицию.
Вот пример кода
#include <stdio.h>
#include <stdlib.h>
int comp(const size_t *i, const size_t *j) { return *i - *j; }
void print_array(size_t* num, size_t size) {
for (size_t i = 0; i < size; ++i) {
fprintf(stdout, "%zu ", num[i]);
}
fprintf(stdout, "\n");
}
size_t uniq(size_t* num, size_t size) {
size_t base = num[0];
size_t pos = 1;
for (size_t i = pos; i < size; ++i) {
if (num[i] != base) {
base = num[i];
num[pos] = num[i];
++pos;
}
}
return pos;
}
int main(void) {
size_t num[] = {1, 3, 2, 1, 2, 3, 4, 7, 2, 4, 1};
size_t size = sizeof(num) / sizeof(size_t);
qsort(num, size, sizeof(size_t), (int (*)(const void *, const void *))comp);
print_array(&num[0], size);
// uniq
size_t pos = uniq(&num[0], size);
print_array(&num[0], size);
fprintf(stdout, "Uniq elem count is = %ld\n", pos);
return 0;
}