int getMainElement(SqList L)
{
//遍历序列,检查序列中每一个元素的值是否符合要求
for(int j=0;j<L.length;j++){
if(L.elem[j]<0||L.elem[j]>=L.length)
return -1;
}
//观察到传入的参数是一个顺序表
//根据主元素的定义
//m需要满足m>(L.length/2)
//先把这个值记录下来
//根据分析,无论原顺序表的长度是奇数还是偶数,m的值都需要大于(L.length/2)
int boundary=L.length/2;
//下面则需要找出在原顺序表中出现次数最多的元素
//由于已知这些元素的数值在[0,L.length)这个区间里面
//最简单的方法是创建一个长度为L.length的数组来记录原顺序表中各个元素出现的次数
int *count=(int*)malloc(sizeof(int)*(L.length));
//初始化这个数组
for(int j=0;j<L.length;j++){
count[j]=0;
}
//遍历顺序表,统计各元素出现的次数
for(int j=0;j<L.length;j++){
count[L.elem[j]]++;
}
//由于出现次数m需要大于L.length/2
//因此一个序列中只可能有一个主元素
//下面遍历记录各元素出现次数的数组,寻找出现次数最多的那个元素
int max;
int maxIndex;
for(int j=0;j<L.length;j++){
if(j==0){
max=count[0];
maxIndex=0;
continue;
}
if(count[j]>max){
max=count[j];
maxIndex=j;
}
}
//执行到这里时已经找到了出现次数最多的元素并记录了其索引
//下面判断这个元素是否符合主元素的要求
//如果不满足就说明该序列不存在主元素
if(max<=boundary)return -1;
//如果满足就返回该出现次数所对应的元素
else return maxIndex;
}
求序列的主元素
最新推荐文章于 2024-08-25 06:11:42 发布