int Find_Main(SqList l1) {
// 1.初始化一个全为0的数组
int temp[list.length] = {0};
// 2.新数组的下标对应元素值,值对应元素个数
for (int i = 0; i < l1.length; i++) {
temp[l1.data[i]]++;
}
// 3.遍历找出主元素
for (int i = 0; i < temp.length; i++) {
if (temp[i] > l1.length / 2 )
return i;
}
return -1;
}
方法一:遍历初始数组(顺序表),新建数组temp,将初始数组的数据与temp数组下标一一对应,并++,最后遍历temp数组即可。
方法二:将初始数组快速排序,然后以排好序的数组的中间元素作为待定主元素,并向左和向右查找与待定主元素相等的数据个数,若其个数>n/2,则是主元素,否则不是主元素
方法二代码如下:
int huafen(int A[],int low,int high){
int mid=A[low];
while(low<high){
while(low<high&&A[high]>=mid) high--;
A[low]=A[high];
while(low<high&&A[low]<=mid) low++;
A[high]=A[low];
}
A[low]=mid;
return low;
}
//快排实现
int Qsort(int A[],int low,int high){
if(low<high){
int pirvo=huafen(A,low,high);
Qsort(A,low,pirvo-1);
Qsort(A,pirvo+1,high);
}
int Find(int A[]){
Qsort(A,0,n-1);
int mid=A[n/2];
int count=0;
for(int i=n/2-1,i>=0;i--){
if(A[i]==mid)
count++;}
for(int i=n/2,i<n;i++)}
if(A[i]==mid)
count++;}
if(count>n/2)
return mid;
else
return -1;