А я так: Для хранения обрабатываемого массива использую свой кольцевой буфер...
#define MED_LEN 7 // 3..31
static unsigned long mediana( unsigned long adc )
{
#define MAX_adc 0xffffffffUL
int a, b;
unsigned long c;
#if ( MED_LEN > 15 )
unsigned long med_pos, k, k1;
#else // MED_LEN <= 15
unsigned int med_pos, k, k1;
#endif // MED_LEN
// + Подготовка - поместим новое значение в кольцевой буфер
*cbuf_mediana.tail = adc;
if ( ++cbuf_mediana.tail == &cbuf_mediana.buf[MED_LEN] )
cbuf_mediana.tail = &cbuf_mediana.buf[0];
// - Подготовка - поместим новое значение в кольцевой буфер
// + Поиск медианы
for ( med_pos = 0, a = 0; a < 1 + ( MED_LEN >> 1 ); a++ ) // достаточно просмотреть половину...
{ for ( b = 0, k = 1, c = MAX_adc; b < MED_LEN; b++, k <<= 1 )
{ if ( !( med_pos & k ) && c > cbuf_mediana.buf[b] )
{ c = cbuf_mediana.buf[b];
k1 = k; // Запомним позицию, чтобы повторно не проверять
}
}
med_pos |= k1;
}
// - Поиск медианы
return( c );
#undef MAX_adc
}