算法习题---线性表之数组主元素查找

Posted ssyfj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法习题---线性表之数组主元素查找相关的知识,希望对你有一定的参考价值。

一:题目

主元素是指:一个数在数组中出现的次数超过数组长度的一半,那么这个数就是数组元素的主元素。
例如:{0,5,5,3,4,5,5,5,5,9}这里面元素5有6个超过了一半,所以就是主元素
使用一种高效率的方法找出数组A的主元素,若有,则输出该元素,否则返回-1

二:思路

这里我们使用计数器的方法来标记数据元素,将第一个元素设置为候补主元素,计数为1,若是下一个元素还是相同的数,计数+1,若是不同,计数-1,当计数为0,则换下一个元素来做候补主元素,计数变1以此循环。
若是数组存在一个真正的主元素,那么该元素的计数一定是一个大于0的数

技术分享图片

第一步:选取2作为候补主元素,计数为1

 技术分享图片

第二步:向后移动,发现数据不同,计数减一,为0,此时变化候补主元素为3,计数变1

技术分享图片

第三步:向后移动,发现数据相同,计数加一,为2 

技术分享图片

第四步:向后移动,发现数据相同,计数加一,为3

技术分享图片

第五步:向后移动,发现数据和候补主元素不同,计数减一,为2

技术分享图片

第六步:向后移动,发现数据和候补主元素相同,计数加一,为3

技术分享图片

第七步:向后移动,发现数据和候补主元素不同,计数减一,为2

技术分享图片

第八步:向后移动,发现数据和候补主元素相同,计数加一,为3

技术分享图片

第九步:向后移动,发现数据和候补主元素相同,计数加一,为4

 技术分享图片

第十步:向后移动,发现数据和候补主元素不同,计数减一,为3

技术分享图片

遍历结束!此时候补主元素为3,计数君为正数,但是我们不能确定是否一定是主元素,所以我们应该循环一遍对该元素进行比较计数,若是计数超过一半,那么这个就是主元素!

三:算法实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int majority(int A[], int n)
{
    int i=1, count=1;    ////计数用
    int maj = A[0];

    for (i = 0; i < n;i++)
    {
        if (A[i] == maj)
            count++;
        else
        {
            if (count > 0)
                count--;
            else
            {
                maj = A[i];
                count = 1;
            }
        }
    }

    if (count>0)    //找到一个最有可能是主元素的值
    {
        //循环计数验证
        count = 0;
        for (i = 0; i < n; i++)
            if (A[i] == maj)
                count++;
    }

    if (count > n / 2)
        return maj;
    return -1;
}

int main()
{
    int A[10] = { 2, 3, 3, 3, 9, 3, 7, 3, 3, 4 };
    int ret;
    ret = majority(A,10);
    printf("%d", ret);
    system("pause");
    return 0;
}

技术分享图片

 

以上是关于算法习题---线性表之数组主元素查找的主要内容,如果未能解决你的问题,请参考以下文章

算法习题---线性表之数组实现循环移动

算法习题---线性表之单链表逆序打印

算法习题---线性表之控制变量个数获取数据最小值

02线性表之顺序表

数据结构之顺序表

数据结构&算法05-线性表之数组