算法習題---線性表之數組主元素查找


一:題目

主元素是指:一個數在數組中出現的次數超過數組長度的一半,那么這個數就是數組元素的主元素。
例如:{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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM