ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
2 мая
1427193 Топик полностью
Boвa (16.04.2024 19:12, просмотров: 63) ответил Idler на Маленький вопросик: Есть uint16_t captures[4]. Как самым быстрым способом найти в нем второе сверху по величине значение. Сортировка, даже 4 значений, дольше, чем хотелось бы. Вроде бы можно сделать несколько сравнений с построением индекса (т.е, по результату первого сравнения +1, по второму +2, по третьему +4 и.т.д), потом таблично. Но вариантов размещения 4 чисел всего 24, а сравнение каждого с каждым дает индекс [0..63], то есть 6 сравнений избыточны...
Можно слиянием за 4 сравнения. 
uint16_t value[4];
uint16_t pred_value(void) { uint16_t t;
if (value[0] < value[1]) { t = value[1]; value[1] = value[0]; value[0] = t; }//1 сравнение и перестановка if (value[2] < value[3]) { t = value[3]; value[3] = value[2]; value[2] = t; }//2 сравнение и перестановка
// теперь value[0] >= value[1] и value[2] >= value[3]
// value[0] или value[2] содержит максимальное число
if (value[0] < value[2]) //3 сравнение
{//value[2] - max, следовательно предмаксимальное в value[0] или value[3]
if (value[0] < value[3]) {t =value[3];} //4 сравнение, которое выполняется если 3 сравнение дало true
else {t =value[0];}
}
else
{//value[0] - max, следовательно предмаксимальное в value[1] или value[2]
if (value[1] < value[2]) {t =value[2];} //4 сравнение, которое выполняется если 3 сравнение дало false else {t = value[1];
}
return t; }