找主元素

一、问题

    序列A[1..n]中是存在主元素? 若有请找出来。
注: A 中主元素是指在A中出现次数多于? n/2?次的元素。

二、算法1——穷举法

时间复杂度:Q(n2)

三、算法2——利用排序算法

时间复杂度:Q(nlogn)

四、算法3——利用找中值元素的算法

时间复杂度:Q(n)

五、算法4


1.算法基本思想
如果删去原序列中的两个不同元素,则原序列中的主元素仍然在剩下的序列中 。

2.算法 MAJORITY

Algorithm  MAJORITY
Input:A array A[1..n] of n elements.
Output: The majority element if it exists;otherwise none.

    1. c←candidate(1)
    2. count←0
    3. for j←1 to n
     4.     if A[j]=c then count←count+1
     5. end for
     6. if count>[n/2] then return c
     7. else return none

Procedure candidate(m)
     1. j←m; c←A[m]; count←1
     2. while j<n and count>0
     3.   j j+1
     4.    if A[j]=c then count←count+1
     5.    else count←count-1
     6. end while
     7. if j=n then return c    {See Exercises 5.31 and 5.32}
     8. else return candidate(j+1) 
  #include <stdio.h> #include <stdlib.h> int candidate(int m,int array[],int n) { int c = array[m]; int count=1; int j=m; while((j<n)&&(count>0)) { j++; if (array[j]==c) { count++; }else { count--; } } if (j==n) { return c; } else { return candidate(j+1,array,n); } } int Majority(int array[],int n) { int c=candidate(1,array,n); int count=0; int j=0; while (j<n) { if (c==array[j]) { count++; } j++; } if (count>(n/2)) { return c; } else { return -1; } } int main() { int array[10]={6,3,6,3,6,1,8,6,6,6}; int num=0; num=Majority(array,10); printf("%d",num); return 0; }

你可能感兴趣的:(找主元素)