摘自《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 &lt; m && index_g &lt;= n)
    {
        if(f[index_f] &lt;= g[index_g])
        {
            index_f++;
        }
        else
        {
            index_g++;
            count += m - index_f;
        }
    }
}