大小为N的数组A,其主要元素是一个出现次数超过N/2的元素(从而这样的元素只有一个或者不存在)
算法:首先找出主要元素的一个候选元(难点)。这个候选元是唯一有可能是主要元素的元素。第二步确定是否这个候选元是主要元素。为了找出候选元,构造第二个数组B。比较A1和A2,如果它们相等则取其中之一加到数组B中;否则什么都不做;然后比较A3和A4,按同样的方式处理,其次类推直到读完这个数组,然后递归的寻找数组B中的候选元,它也是A的候选元。(PS:可以用A来代替B的作用从而避免使用附加数组)
下面我的算法是使用了数组A来代替数组B
//找出一个数组的主要元素的候选元,寻找过程中会改变数组的元素位置
#include <iostream>
using namespace std;
void Swap(int* a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void PrintArray(int *array, int n)
{
if (n <= 0)
return;
cout<<"Array:";
for (int i = 0; i < n; ++i)
{
cout<<array[i]<<" ";
}
cout<<endl;
}
int FindProbableMainCell(int *array, int n)//寻找候选元
{
if(n <= 1)
return array[0];
else
{
for(int i = 0, len = 0; i < n; i += 2)
{
if(i == n - 1)//当n为奇数时,此时i指向最后一个元素,直接放入数组中
{
//array[len++] = array[i];
Swap(&array[len], &array[i]);
++len;
return FindProbableMainCell(array, len);
}
if(array[i] == array[i+1])
{
//array[len++] = array[i];
Swap(&array[len], &array[i]);
++len;
}
else if(array[i] != array[i+1])
;// do nothing
if(i == n - 2)//当n为偶数时,此时上面的代码已经比较完最后两个元素因此可以直接递归寻找候选元
return FindProbableMainCell(array, len);
}
}
}
bool FindMainCell(int *array, int n, int cell)//确定候选元是否为主要元素
{
int num = 0;
for(int i = 0; i != n; ++i)
{
if(array[i] == cell)
++num;
}
if(num >= n / 2)
return true;
else
return false;
}
int main(int argc, char const *argv[])
{
int x, len;
cout<<"Please input len:"<<endl;
cin>>len;
int *array = (int*)new int [len];
cout<<"Please input "<<len<<" numbers"<<endl;
for(int i = 0; i != len; ++i)
{
cin>>x;
array[i] = x;
}
int cell = FindProbableMainCell(array, len);
cout<<"The probable main cell is "<<cell<<endl;
if(FindMainCell(array, len, cell))
cout<<"The main cell is "<<cell<<endl;
else
cout<<"The array doesn't hold a main cell!!!"<<endl;
delete [] array;
return 0;
}