Допиляв код.
Так як є бажання динамічно змінювати довжину масиву, зіткнувся з перепоною - розмір масиву не може бути заданий змінною; це пов'язано з тим, що розмір глобального масиву повинен бути відомим до початку роботи програми.
Але розмір локального масиву (у функції) можна задати змінною, тому що локальний масив виділяється з динамічної пам'яті та може бути будь якого розміру.
Тому масив для сортування розміщено у функції:
Код: Виділити все
/* функція розрахунку медіани*/
int MedianFilter(int *window, int intArrSize) // аргументами функції є посилання на масив та довжина масиву
{
int newArray[intArrSize]; // масив для функції
Копіювання масиву за топомогою
memcpy(newArray, window, intArrSize); у функції чомусь не працює, тому повернувся до "перезапису"
(можна попробувати зробити "вхідне" сортування та подивитись чи буде виграш у часі виконання):
Код: Виділити все
/* копіювання масиву */
//memcpy(newArray, window, intArrSize);
/**/
byte c;
for (c = 0; c < intArrSize; c++)
{
newArray[c] = window[c];
}
У такій реалізації найкращі результати показала модифікація алгоритму сортування включенням (Insertion sort) від
pawa:
Код: Виділити все
/* сортування включенням (Insertion sort) */
int counter = 0;
for (int i = 1; i < intArrSize; i++)
{
for (int j = i; j > 0 && *(newArray + j - 1) > *(newArray + j); j--)
{
counter++;
int tmp = *(newArray + j - 1);
*(newArray + j - 1) = *(newArray + j);
*(newArray + j) = tmp;
}
}
Інший код, практично, без змін.
PS. Можна відмовитись від посилання на масив вхідних даних в аргументі функції. Варто у функцію передавати лише потік даних, а записувати їх у "материнський" масив вже у самій функції.
PPS. У додадому архіві тестовий скетч сортування включенням (Insertion sort) на довільний розмір вікна: