问题描述
主元素是一组n个数中出现次数大于n/2的数。
求一个数组中的主元素。
partition算法
取数组中的一个数,将数组分成两部分(比它大和比它小),再接着在子问题中求解。这是一个常用的算法(以后还会补充)。
代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int n;
int mode(int * array,int l,int r,int n){
if(l>=r) return array[l];
int i = l;
int j = r;
int m = (l+r)/2;
int c = 0;
int pivot = array[m];
while(i < j){
while(i<j && array[i]<pivot){
i++;
}
while(i<j && array[j]>pivot){
--j;
}
if(i<j){
if(array[i]==pivot) ++c;
if(array[j]==pivot) ++c;
swap(array[i],array[j]);
++i;
--j;
}
}
if(i == j && array[j] == pivot)
++c;//pivot出现次数加1
if(i == j && array[j]>pivot){
--j;
}
if(c >= n/2) return pivot;
if(j-l+1>=n/2) //小于pivot的个数大于等于一半,在左半部分找
return mode(array,l,j,n);
return mode(array,j+1,r,n);//在右半部分找
}
int main(){
int *a;
cin>>n;
a = new int[n+1];
for(int i = 0 ; i < n ; i++)
cin>>a[i];
cout<<mode(a , 0 , n-1 , n)<<endl;
delete []a;
return 0;
}
/*
6
1 2 2 2 3 2
*/