采用分组比赛的算法:首先将L中的元素两两一组,分成L/2组(当n为奇数值有一个元素轮空),每组中的两个数通过一次比较确定本组的“较大”和“较小”,把至多n/2+1(当n为奇数时,需要把被轮空的元素加进来)个小组“较大”放在一起,运行Findmax()算法找出其中较大的,它就是L中的最大元素。类似的再把至多n/2+1个小组“较小”放到一起,运行Findmin()算法找出最小元素,即为L中最小的元素。
FindMaxMin()算法的伪代码为:
输入:n个数的数组L
输出:max,min
- 将n个元素两两一组分成n/2组;
- 每组比较,得到n/2个较小的和n/2个较大的;
- 在n/2个(n为奇数时,是n/2+1)较小中找最小min;
- 在n/2个(n为奇数时,是n/2+1)较大中找最大max;
其中Findmax()和Findmin()算法函数代码如下(推导参考上一篇文章):
//找最大
void Findmax(int L[],int len){
int max,i;