Próbuję opracować algorytm w postaci funkcji, która akceptuje dwa parametry, tablicę i rozmiar tablicy. Chcę, aby zwrócił tryb tablicy i jeśli istnieje wiele trybów, zwróć średnią. Moją strategią było wziąć tablicę i najpierw ją posortować. Następnie policz wszystkie wystąpienia liczby. podczas gdy liczba ta występuje, dodaj jedną do liczenia i zapisz ją w tablicy m. Więc m trzyma wszystkie liczby, a inna tablica q zatrzymuje ostatnią wartość, którą porównujemy.Algorytm trybu obliczeniowego
Na przykład: moja lista jest {1, 1, 1, 1, 2, 2, 2}
wtedy bym m[0] = 4 q[0] = 1 and then m[1] = 3 and q[1] = 2.
więc tryb q[0] = 1;
niestety nie miałem do tej pory sukces. mając nadzieję, że ktoś może pomóc.
float mode(int x[],int n)
{
//Copy array and sort it
int y[n], temp, k = 0, counter = 0, m[n], q[n];
for(int i = 0; i < n; i++)
y[i] = x[i];
for(int pass = 0; pass < n - 1; pass++)
for(int pos = 0; pos < n; pos++)
if(y[pass] > y[pos]) {
temp = y[pass];
y[pass] = y[pos];
y[pos] = temp;
}
for(int i = 0; i < n;){
for(int j = 0; j < n; j++){
while(y[i] == y[j]) {
counter++;
i++;
}
}
m[k] = counter;
q[k] = y[i];
i--; //i should be 1 less since it is referring to an array subscript
k++;
counter = 0;
}
}
Nie zwracasz niczego ze swojej funkcji. Nie jest dla mnie jasne, co masz na myśli mówiąc o * trybie * i/lub o tym, jaki powinien być wynik tej funkcji. Jeśli powinna to być średnia wszystkich wartości, może po prostu "zwrócić std :: accumulate (x, x + n, 0.0)/n;". BTW, C++ nie ma tablic o zmiennych rozmiarach. Możesz jednak użyć 'std :: vector y (n);'. –
@ DietmarKühl Funkcja nie została zakończona. Przez tryb mam na myśli wartość, która występuje najczęściej w tablicy. Nie używam tablicy o zmiennej wielkości, ponieważ rozmiar tablicy jest parametrem n. –
Prawdopodobnie chcesz spojrzeć na 'std :: map' lub' std :: unordered_map', aby policzyć liczbę wystąpień każdej wartości. Oczywistą alternatywą byłoby zamiast tego użycie Boost ['bimap'] (http://www.boost.org/doc/libs/release/libs/bimap/doc/html/index.html). –