1. 程式人生 > >算法習題---線性表之數組主元素查找

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

info def 進行 元素查找 變化 lib .com 否則 fin

一:題目

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

技術分享圖片

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