Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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 使用递归查找数组中的第二大元素_Algorithm_Sorting_Data Structures_Recursion - Fatal编程技术网

Algorithm 使用递归查找数组中的第二大元素

Algorithm 使用递归查找数组中的第二大元素,algorithm,sorting,data-structures,recursion,Algorithm,Sorting,Data Structures,Recursion,正如标题所说,是否有任何有效的方法可以使用递归查找数组中的第二大元素?如果对数组一无所知,那么无论是递归还是迭代,都无法比O(n)做得更好 只需递归地传递数组,同时传递两个最大的元素,如果发现较大的值,则替换它们 find_largest(array_begin, largest, secondLargest) if (array_begin = NULL) return secondLargest if (array_begin.value > larges

正如标题所说,是否有任何有效的方法可以使用递归查找数组中的第二大元素?

如果对数组一无所知,那么无论是递归还是迭代,都无法比
O(n)
做得更好

只需递归地传递数组,同时传递两个最大的元素,如果发现较大的值,则替换它们

find_largest(array_begin, largest, secondLargest)
    if (array_begin = NULL)
       return secondLargest
    if (array_begin.value > largest)
       secondLargest = largest
       largest = array_begin.value
    return find_largest(array_begin+1, largest, secondLargest)
maximust
secondmaximust
最初可以设置为您希望在数组中找到的最小值

你说得对,排序(至少是完全排序)太过分了

本质上是递归的,它允许您选择数组中的
k
第n个元素,因此使用它-您实际上可以找到任何
k
的答案,包括
k=n-1
(您的案例)

这是在
O(n)
中以相当低的常数平均完成的。

O(n)
中的某些东西如下:

int findSecondLargest(int[] arr, int index, int largest, int secondLargest) {
    if(index == arr.length) {
        return secondLargest;
    }
    int element = arr[index];
    if(element > secondLargest) {
        if(element > largest) {
            return findSecondLargest(arr, index + 1, element, largest);
        } else {
            return findSecondLargest(arr, index + 1, largest, element);
        }
    }
    return findSecondLargest(arr, index + 1, largest, secondLargest);
}
public void递归(int[]数据,int ind,int max1,int max2){
if(indmax1){
int-temp=max1;
max1=数据[ind];
max2=温度;
}else if(数据[ind]>max2){
max2=数据[ind];
}
递归(数据,ind+1,max1,max2);
}否则{
返回max2;
}
返回-1;
}
称之为:
递归(dataX,0,Integer.MIN\u值,Integer.MIN\u值)

本能地,您可以扫描数组并对每个值进行两次比较。无论如何,你需要O(n)来解决这个问题。够快了


当不需要递归时,尽量避免递归,因为它不是免费的。

如果通过递归进行,那么最多只能进行3(n)/2-2比较,但为了更好的解决方案,请将此问题视为具有n个节点的二叉树。然后将进行n-1比较以查找最大值,并进行log(n)-1比较以查找第二大值。但是有些人认为它需要n+log(n)比较。

向我们展示您的代码,我们会告诉您它是否有效您必须使用递归吗?没有它很容易。效率和递归是两个不同的方向。假设它是未排序的,最简单的方法是遍历数组一次,找到最大的元素,然后再次遍历,找到小于最大元素的最大元素。你可以使用递归;它将递归两次。@iamnotmaynard如果可以传递一次,为什么要传递两次?如果数组中没有任何信息,我如何设置最小值?你是说第一个元素吗?@Neel我的意思是没有其他信息-也就是说,如果你知道数组已排序,你可以在
O(1)
中进行排序。
    public void recurs(int[] data, int ind, int max1, int max2){
        if(ind<data.length){
            if(data[ind]>max1){
                int temp = max1;
                max1 = data[ind];
                max2 = temp;
            } else if(data[ind]>max2){
                max2 = data[ind];
            }
            recurs(data, ind+1, max1, max2);
        } else {
            return max2;
        }
        return -1;
    }