123456789101112131415161718192021222324252627 |
- /*
- http://electronix.ru/forum/index.php?showtopic=114436&view=findpost&p=1180944
- Алгоритм основан на последовательной проверке точек массива на их "медианность".
- Проверка состоит в сравнении точки со всеми остальными - подсчетом двух сумм (s1 и s2) - количества точек, которые оказались больше данной, и количества тех, которые оказались меньше нее.
- Превышение показания хотя бы одного из счетчиков свыше половины длины массива (slit) бракует данную точку ДОСРОЧНО и переходит к проверке следующей (переход на nexti).
- До полного перебора всех точек обычно не доходит, т.к. подходящая точка находится раньше (где-то в середине массива), т.е. тоже ДОСРОЧНО.
- */
- datatype median( datatype array, int length) // массив и его длина
- {
- int slit = length/2;
- for( int i=0; i < length; i++) {
- int s1=0, s2=0;
- datatype val = array[i];
- for( int j=0; j < length; j++) {
- if( array[j] < val) {
- if( ++s1 > slit) break;
- } else if( array[j] > val) {
- if( ++s2 > slit) break;
- }
- }
- return val;
- }
- return 0; // чистая формальность, досюда исполнение никогда не доходит
- }
|