您的位置:首页 > 其它

求主元素

2015-11-02 10:34 274 查看
问题描述:有一个整数数列,数列中元素出现次数超过一半的元素定义为主元素,设计一分治算法,求出主元素。

输入:整数的个数n以及n个整数

输出:如果有主元素,输出主元素以及它们所在的位置;如果没有主元素,输出-1.

考研数据结构题:

#include <iostream>
using namespace std;
int searchMain(int A[],int n)
{
int i;
int c=A[0],count=1;
for(i=1;i<n;i++)
{
if(A[i]==c)
{

count++;
}else{
if(count>0)
{
count--;
}else{
c=A[i];
count=1;
}

}
}
if(count>0)
{

for(i=count=0;i<n;i++)
{

if(A[i]==c)
{

count++;
}
}
}

if(count>n/2)
{

return c;
}else{
return -1;
}

}

#define LEN(arr) sizeof(arr)/sizeof(arr[0])

int main(int argc,char* argv[])
{
int count;
cin>>count;
while (count--) {
int n;
cin>>n;
//int a[]={0,5,5,7,5,5,3,6,5,3,3,3,3,3,3,3,3,3,3,8};
int *a=new int
;//输入动态数组
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int c=searchMain(a,n);
printf("%d\n",c);

}
return 0;
}
#include <iostream>
using namespace std;
int searchMain(int A[],int n)
{
int i;
int c=A[0],count=1;
for(i=1;i<n;i++)
{
if(A[i]==c)
{

count++;
}else{
if(count>0)
{
count--;
}else{
c=A[i];
count=1;
}

}
}
if(count>0)
{

for(i=count=0;i<n;i++)
{

if(A[i]==c)
{

count++;
}
}
}

if(count>n/2)
{

return c;
}else{
return -1;
}
}
//计数排序
int Major(int A[],int n)
{
int i,*p,max;
p=(int*)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
{
p[i]=0;
}
max=0;
for(i=0;i<n;i++)
{

p[A[i]]++;
if(p[A[i]]>p[max])
{

max=A[i];
}
}
if(p[max]>n/2)
{

return max;
}else{
return -1;
}

}

#define LEN(arr) sizeof(arr)/sizeof(arr[0])

int main(int argc,char* argv[])
{
int count;
cin>>count;
while (count--) {
int n;
cin>>n;
//int a[]={0,5,5,7,5,5,3,6,5,3,3,3,3,3,3,3,3,3,3,8};
int *a=new int
;//输入动态数组
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int c=Major(a,n);
printf("%d\n",c);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: