问题描述
有一个老板有一袋金块。每个月将有两名雇员会因其优异的表现分别被奖励一个金块。按规矩排名第一的雇员将得到袋中最重的金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式除非有新的金块加入袋中,否则第一名雇员所得到的金块总是比第二名雇员所得到的金块重。如果有新的金块周期性的加入袋中,则每个月都必须找出最轻和最重的金块。假设有一台比较重量的仪器,我们希望用最少的比较次数找出最轻和最重的金块 。
方法
能采用的方法有蛮力法,二分法(分治法)等。一般情况下,选择二分法较为快速,但内存消耗较大。
蛮力法算法
Step1 将所有金块重量存于数组
Step2 将第一个金块同时标记为最重和最轻的金块
Step3 将第一个与后一个进行重量的比较,将更重的标记为max,同时如果现阶段最轻的比后者轻,那么将后者标记为min。
Step4 依次进行比较,最重得到最重的和最轻的max min.
Step2 将第一个金块同时标记为最重和最轻的金块
Step3 将第一个与后一个进行重量的比较,将更重的标记为max,同时如果现阶段最轻的比后者轻,那么将后者标记为min。
Step4 依次进行比较,最重得到最重的和最轻的max min.
public float[] MaxMin(float[] ary){
float MM[] = new float[2];
MM[0] = MM[1] = ary[0];
for ( int i = 1; i < ary.length - 1; i++ ) {
if(ary[i]>MM[0]){
MM[0] = ary[i];
}else if(ary[i]<MM[1]){
MM[1] = ary[i];
}
}
return MM;
}
二分法算法
问题抽象、简化为:在n个元素的集合中寻找最大和最小值元素。
(1)将集合一分为二,变为两个集合,目的是在较小的两个集合中分别找最大、最小元素。
(2)递归分解较小集合,直到每个集合中的元素个数≤2,然后找出小集合的最大、最小元素。
(3)合并(回溯):自低向上把子问题的解合并,大元素中取最大者,小元素中取最小者,最后得到元问题的解。
参考
http://3y.uu456.com/bp_0gi063s9b06cyp27mpar_1.html
http://www.doc88.com/p-956216846019.html