先说说标题什么意思
就是有些时候写程序需要把一组数(例如5 2 4 1 3)中的中位数找出来(这里是3)
普通思路是排序后直接选出,如下面代码
for (i = 0; i < N; i++)
{
for (j = i + 1; j < N; j++)
{
if (num[i]>num[j])
{
int c;
c = num[i];
num[i] = num[j];
num[j] = c;
}
}
}
middle = num[(N + 1) / 2];
当然,这里也可以用快速排序qsort ,运算还会快很多。
然而有些时候我们后面还得用到这组数的顺序(即5 2 4 1 3 的顺序不变)
若用以上方法则要再开另一组数组,这样就比较费内存了。(这是以下运算的主要好处)
所以,我想出来了下面这种方法(计算速度可能慢点)
先贴代码
for (i = 0; i <N/2; i++)
{
int max = 0;
for (j = 0; j < N; j++)
{
if (i == 0 && max < num[j])
max = num[j];
else if (num[j]>max&&num[j] < middle)
max = num[j];
}
middle = max;
}
对于这种算法,好处在于不用改变原数组,不过运算相对快排慢点,比冒泡快点。
不过写起来该种方法较复杂,不注意可能容易出错,所以应该谨慎使用!