算法習題---線性表之數組主元素查找
阿新 • • 發佈:2018-09-01
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; }
算法習題---線性表之數組主元素查找