如果一个数组A[1..n]中超过半数的元素都相同时,该数组被称为含有主元素。
算法:利用切分函数查找中位数,遍历数组如果与中位数相等的元素个数大于数组长度一半,那么则存在主元素,这个中位数即主元素。
代码:
#include <stdio.h>
void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int hoare_partition(int a[],int left,int right)
{
int i,j,pivot;
pivot = a[left];
i = left - 1;
j = right + 1;
while(1)
{
do
{
j--;
}while(a[j]>pivot);
do
{
i++;
}while(a[i]<pivot);
if(i<j)
swap(a+i,a+j);
else
return j;
}
}
int partition(int a[],int left,int right)
{
int i,j;
int pivot = a[right];
i = left - 1;
for(j=left;j<right;j++)
{
if(a[j]<=pivot)
{
i++;
swap(a+i,a+j);
}
}
swap(a+i+1,a+right);
return i+1;
}
int selectKth(int a[],int left,int right,int K)
{
int idx = partition(a,left,right);
if(idx-left+1 == K)
return idx;
else if (idx-left+1 < K)
return selectKth(a,idx+1,right,K-(idx-left+1));
else
return selectKth(a,left,idx-1,K);
}
void qSort(int a[],int left,int right)
{
if(left<right){
int idx = partition(a,left,right);
qSort(a,left,idx-1);
qSort(a,idx+1,right);
}
}
int major_element(int a[],int left,int right)
{
/* major element exist if non-negative is returned. */
if(left<=right){
int mid = selectKth(a,left,right,(right-left+2)>>1);
int cnt = 0;
for(int i=left;i<=right;i++){
if(a[i] == a[mid])
cnt++;
}
if(cnt>(right-left+1)>>1)
return mid;
}
return -1;
}
void showArray(int a[],int l,int r)
{
for(int i=l;i<=r;i++)
printf("%-3d",a[i]);
printf("\n");
}
int main(){
int a[] = {1,4,2,3,4,5,4,4,4};
int b[] = {1,3,2};
int c[] = {2};
int d[] = {4,4,4,4,1,2,3,5};
showArray(a,0,8);
showArray(b,0,2);
showArray(c,0,0);
showArray(d,0,7);
int m = major_element(a,0,8);
printf("Major element exist in List a? %s \n",m>-1?"Yes!":"No!");
printf("%-3d\n",a[m]);
showArray(a,0,8);
m = major_element(b,0,2);
printf("Major element exist in List b? %s \n",m>-1?"Yes!":"No!");
m = major_element(c,0,0);
printf("Major element exist in List c? %s \n",m>-1?"Yes!":"No!");
m = major_element(d,0,7);
printf("Major element exist in List d? %s \n",m>-1?"Yes!":"No!");
qSort(a,0,8);
qSort(b,0,2);
qSort(c,0,0);
qSort(d,0,7);
showArray(a,0,8);
showArray(b,0,2);
showArray(c,0,0);
showArray(d,0,7);
}
测试结果:
1 4 2 3 4 5 4 4 4 (Array a)
1 3 2 (Array b)
2 (Array c)
4 4 4 4 1 2 3 5 (Array d)
Major element exist in List a? Yes!
4
1 4 2 3 4 4 4 4 5
Major element exist in List b? No!
Major element exist in List c? Yes!
Major element exist in List d? No!
1 2 3 4 4 4 4 4 5
1 2 3
2
1 2 3 4 4 4 4 5