Подсчитать число различных значений в массиве/Алгоритм си

Нужно * Подсчитать число различных значений в массиве* , как реализовать?Сначала думаю нужно отсортировать массив,а потом?А если будут числа одинаковые попадаться? :(


Ответы (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;
}
→ Ссылка