摘自《C语言名题精选百则》
题目:已知f[]与g[]两个整数数组,元素已经从小到大排列,请写一个程序,算出f[]中比g[]元素大的对数。换句话说,f[0]比g[]中多少个元素大,f[1]比g[]中多少元素大等,这些值的总和就是要求的答案。
我的想法:当f[i] > g[j]时,假设f[i]比g[]的x个数大,则f[i+1]比g[]中大的个数必定大于或等于x,于是从f[i+1]开始,就可以和g[j]开始比较
这样做的缺点时,不能一次性确定f[i+1]比g[]中大的数的个数,所以写出来的程序有点繁琐。
程序如下:
#include <stdio.h>
int main(int argc, char *argv[])
{
int g[3] = {1,2,3};
int f[3] = {1,4,5};
int count = getcount(f, 3, g, 3);
printf("%d\n", count);
return 0;
}
int getcount(int *f, int m, int *g, int n)
{
int sum = 0;
int ts = 0, pre_ts = 0;
int i = 0, j = 0;
while(i < m)
{
if(j == n-1)
{
sum += ts;
i++;
continue;
}
if(f[i] > g[j])
{
ts++;
pre_ts = ts;
if(j < n - 1)
{
j++;
}
if(j == n-1)
{
if(f[i] > g[j])
{
ts++;
}
}
}
else
{
sum += ts;
ts = pre_ts;
i++;
}
}
return sum;
}
书中参考程序是这样的思想:
当f[i] <= g[j]时,则i = i+1;
当f[i] > g[j]时,注意这是f[]中第一个大于g[j]的数,所以f[]中总共有(f[]数组中元素的个数 - i)个数大于g[j]个数
参考程序如下:
int getcount(int *f, int m, int *g, int n)
{
int count = 0;
int index_f = 0, index_g = 0;
while(index_f < m && index_g <= n)
{
if(f[index_f] <= g[index_g])
{
index_f++;
}
else
{
index_g++;
count += m - index_f;
}
}
}