递归算法找到数组中的最小元素

Posted

技术标签:

【中文标题】递归算法找到数组中的最小元素【英文标题】:recursive algorithm to find smallest element in array 【发布时间】:2012-03-16 11:02:00 【问题描述】:

我有一些递归算法的伪代码,可以在数组中找到最小的数。

这是算法。

Min(A[0..n - 1])
If n = 1 return A[0]
else
 
  temp <-- Min(A[0..n - 2])
  if temp <= A[n - 1]
     return temp
  else return A[n - 1]

我不理解这个伪代码的一部分是“temp

我的另一个问题是如何在代码中实现该行。我正在使用 Java。

提前感谢您的帮助。

【问题讨论】:

每次递归都需要离递归结束更近一次。 (当你只有一个元素时) 感谢您的回复。我将如何实现这个伪代码?不清楚我将如何处理代码中的那一行。 【参考方案1】:

因为您的数组索引从 0 到 n-1,包括在内。您需要递归一个元素较小的子数组,因此是 n-2。

【讨论】:

【参考方案2】:

我的另一个问题是如何在代码中实现该行。

如果您使用的是数组。

// create an array with one less element.
A a2 = new A[a.length-1];
// copy the elements
System.arrayCopy(a,0,a2,0,a2.length);

如果您使用的是列表

List<A> a2 = a.subList(0, a.length-1);

【讨论】:

【参考方案3】:

对于您的第一个问题:

由于您使用的是递归算法,因此为了解决问题,您首先必须以较小的大小解决相同的问题。在这个伪代码中,为了找到长度为 n 的数组的最小值,首先找到大小为 n-1 的同一数组的最小值,然后将最小值与第 n 个元素进行比较。您的数组的索引从 0 到 n-1(这将使其长度 = n),因此对于递归调用,您必须从索引 0 到 n-2(n-1 个元素)调用数组。

对于您的第二个问题: 这就是我在 Java 中实现代码的方式:

public class Minimum 
   public Minimum(int[] A) 
    findMin(A, 0, A.length-1);


public int findMin(int [] A, int start, int end)
    if (start== end-1)
        return A[0];
    else
        int temp=findMin(A, start, end-1 );
        if (temp<=A[end]) 
            return  temp;
        else 
            return A[end];
    



【讨论】:

这是你询问的那一行 -> int temp=findMin(A, start, end-1 );

以上是关于递归算法找到数组中的最小元素的主要内容,如果未能解决你的问题,请参考以下文章

使用递归函数查找数组的最小数量

求数组主元素的递归算法

用于查找数组中最小值的分治算法

基础算法 分治法求最大最小元

递归分治算法之二维数组二分查找(Java版本)

算法递归算法 ② ( 使用递归实现二分法 | if else 编码优化 )