主元素(Version2.0, 算法执行效率较Version1.0提升)

已知一个整数序列A=(a0​,a1​,…,an−1​),其中0≤ai​≤n,0≤i<n)。若某元素在数据序列中重复出现的次数为m,且m≥n/2,则称x为A的主元素。

如A=(0,5,5,3,5,7,5,5),则5为主元素;又如A=(0,5,5,3,5,1,5,7),则A中没有主元素。

假设顺序表A中有n个元素,请设计算法,找出A的主元素,若存在主元素,则输出主元素;否则输出A中没有主元素的信息。

输入

每组数据有两行,第一行为一个整数n,代表数组中有n个元素。第二行为数组中的n个元素(元素之间用空格分隔)。

输出

每组数据输出一行,若数组中存在主元素,输出主元素的值,若数组中不存在主元素,则输出A中没有主元素。

输入示例1

5  
1 2 3 4 5  

输出示例1

There is no main element.

输入示例2

7  
4 5 5 5 1 5 7

输出示例2

The main element of A is 5.

 [程序代码]

#include<stdio.h>
void InitArray(short *, short);
short MainElement(short *, short);
int main()
{
    /* 数据集合中元素的个数 */
    short N;
    while(scanf("%hd", &N) != 1 || N < 1)
    {
        while(getchar() != '\n') ;
        printf("请输入合法数据.\n");
    }
    /* 定义数据集合 */
    short value[N];
    /* 初始化数据集合 */
    InitArray(value, N);
    /* 寻找数据集合中的主元素 */
    short temp = MainElement(value, N);
    if(temp == -1)
    {
        /* 没找到主元素 */
        printf("There is no main element.\n");
    }
    else
    {
        /* 找到主元素 */
        printf("The main element of A is %hd\n", temp);
    }
}
/* 寻找数据集合中的主元素 */
short MainElement(short *p, short N)
{
    short i, j;
    short sum = 0;
    for(i = 0; i <= N / 2; i ++)
    {
        /* 我们以7个元素和8个元素为例进行分析 */
        /* 7个元素: 如果判断执行到下标为4的元素, 即使下标为5、6的元素和下标为4的元素相同, 也无法满足主元素的条件 */
        /* 8个元素: 如果判断执行到下标为4的元素, 即使下标为5、6、7的元素和下标为4的元素相同, 也无法满足主元素的条件 */
        /* 从这里我们可以看出外层循环执行到 i ==  N / 2时即可 */
        for(j = 0, sum = 0; j < N; j ++)
        {
            if(j != i)
            {
                if(*(p + i) == *(p + j))
                {
                    sum ++;
                }
            }
            if(sum >= N / 2)
            {
                return *(p + i);
            }
        }
    }
    /* 程序执行至此, 说明没找到主元素 */
    return -1;
}
/* 初始化数据集合 */
void InitArray(short *p, short N)
{
    short i = 0;
    while(i < N)
    {
        scanf("%hd", p + i);
        i ++;
    }
}

[]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好梦成真Kevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值