Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用3n/2比较法寻找最大和最小元素?_Algorithm - Fatal编程技术网

Algorithm 使用3n/2比较法寻找最大和最小元素?

Algorithm 使用3n/2比较法寻找最大和最小元素?,algorithm,Algorithm,我试图设计一个算法,给定n个元素的列表,在3n/2比较中找到最小值和最大值。关于如何做的任何提示?作为提示,假设所有数组元素都是淘汰赛中的玩家。将所有玩家配对,让“赢家”(数字较大)进入一场比赛,“输家”(数字较小)进入输家的行列。现在你将有n个/ 2个赢家要考虑,最大值必须是其中之一,而n/2个失败者要考虑,最小值必须是其中之一。在此过程中,您进行了n/2比较。你能用剩下的n个比较来找出一组的最小值和另一组的最大值吗?@templatetypedef的提示是正确的: 公共静态void find

我试图设计一个算法,给定n个元素的列表,在3n/2比较中找到最小值和最大值。关于如何做的任何提示?

作为提示,假设所有数组元素都是淘汰赛中的玩家。将所有玩家配对,让“赢家”(数字较大)进入一场比赛,“输家”(数字较小)进入输家的行列。现在你将有n个/ 2个赢家要考虑,最大值必须是其中之一,而n/2个失败者要考虑,最小值必须是其中之一。在此过程中,您进行了n/2比较。你能用剩下的n个比较来找出一组的最小值和另一组的最大值吗?

@templatetypedef的提示是正确的:

公共静态void findMinimumAndMaximumOf(int[]个数){
断言数字。长度>=2;
List bigList=newarraylist(numbers.length/2);
List smallerList=新数组列表(numbers.length/2);
int i=1;
对于(;i数字[i-1]){
添加(编号[i]);
添加(数字[i-1]);
}否则{
添加(编号[i-1]);
添加(数字[i]);
}
}
如果((number.length&1)==1){
if(数字[numbers.length-1]>数字[numbers.length-2]){
添加(数字[numbers.length-1]);
}否则{
smallerList.add(数字[numbers.length-1]);
}
}
迭代器iBig=bigList.Iterator();
int max=iBig.next();
while(iBig.hasNext()){
int current=iBig.next();
如果(当前>最大){
最大=电流;
}
}
迭代器iSmall=smallerList.Iterator();
int最小值=iSmall.next();
while(iSmall.hasNext()){
int current=iSmall.next();
if(电流<最小值){
最小=电流;
}
}
System.out.println(String.format(“最大:%d,最小:%d”,最大,最小));
}

在这个过程中你不能找到最小值和最大值吗?@chieftwoils是的。我有点希望OP会做一些工作来找出解决方法。:-)向上投票,但根据n是偶数还是奇数,计算时必须稍微小心。我认为当n为偶数时,会得到3n/2-2比较,当n为奇数时,会得到(3n-3)/2比较。@PaulHankin这是真的。我可能应该说“最多”,而不是“确切地说。”“可能的答案太多了”?你能列出多少可能的答案?我想知道。如果你不能,请收回你的-3票。
public static void findMinimumAndMaximumOf(int[] numbers) {
    assert numbers.length >= 2;
    List<Integer> bigList = new ArrayList<>(numbers.length / 2);
    List<Integer> smallerList = new ArrayList<>(numbers.length / 2);
    int i = 1;
    for (; i < numbers.length; i = i + 2) {
        if (numbers[i] > numbers[i - 1]) {
            bigList.add(numbers[i]);
            smallerList.add(numbers[i - 1]);
        } else {
            bigList.add(numbers[i - 1]);
            smallerList.add(numbers[i]);
        }
    }
    if ((numbers.length & 1) == 1) {
        if (numbers[numbers.length - 1] > numbers[numbers.length - 2]) {
            bigList.add(numbers[numbers.length - 1]);
        } else {
            smallerList.add(numbers[numbers.length - 1]);
        }
    }
    Iterator<Integer> iBig = bigList.iterator();
    int biggest = iBig.next();
    while (iBig.hasNext()) {
        int current = iBig.next();
        if (current > biggest) {
            biggest = current;
        }
    }
    Iterator<Integer> iSmall = smallerList.iterator();
    int smallest = iSmall.next();
    while (iSmall.hasNext()) {
        int current = iSmall.next();
        if (current < smallest) {
            smallest = current;
        }
    }
    System.out.println(String.format("Max:%d, Min:%d" ,biggest,smallest));
}