今天在网上看了一道面试题:
给定三个整数a,b,c,实现函数int median(int a, int b, int c),返回三个数的中位数。不可以使用sort,要求整数操作(比较,位运行,加减乘除等)次数尽量少。 并分析说明程序最坏和平均情况下使用的次数。
看到这道题,第一想法是什么是中位数?于是百度了下:
中位数(Medians)统计学名词,是指将统计总体当中的各个变量值按大小顺序排列起来,形成一个数列,处于变量数列中间位置的变量值就称为中位数,用Me表示。当变量值的项数N为奇数时,处于中间位置的变量值即为中位数;当N为偶数时,中位数则为处于中间位置的2个变量值的平均数。 |
那此时题目的意思的就明了了,即对3个数排序,然后返回中间的数,此时想下最少的比较次数,即选中中间的数,另外两个数比较,一次大,一次小,则此时选中的数即为中位数,返回即可,需要2次比较。
a<b<c时,选中b,与a比较,发现a<b,与c比较,发现b<c,那此时返回b即可,分析到此处,即可写出代码来了,
int median( int a, int b, int c )
{
int min,max;
if ( a < b )
{
min = a;
max = b;
}
else
{
min = b;
max = a;
}
// 此时有 min<=max
if ( max <= c )
return max;
else // min <= max, c <max,
{
// 比较min和c
if ( min <= c ) // min <=c < max
return c;
else
return min; // c< min <= max
}
}
分析下最少比较2次,最多比较3次,平均2.5次。