经典程序拿来分享。把数组元素看作二叉树的叶子,两两比较,把较小的和较大的分别记录。当数组长度为n,n为偶数,比较次数为3*(n/2-1),n为奇数,比较次数为3*(n-1)/2。可以证明这种非递归算法的比较次数最少。
原理如下图所示,实际上运用非递归的方法实现递归。

代码如下:
template<typename T>
bool minmax(T a[], int n, int& indexOfMin, int& indexOfMax)
{//在数组a[0:n-1]中确定最轻和最重元素的位置,如果少于一个元素,返回false
if (n < 1) return false;
if (n == 1)
{
indexOfMin = indexOfMax = 0;
return true;
}
//n>1
int s = 1; //循环的起点
if (n % 2 == 1) //n为奇数
indexOfMin = indexOfMax = 0;
else
{//当n是偶数时,首先比较位置0和位置1上的元素
if(a[0]>a[1])
{ indexOfMin = 1; indexOfMax = 0; }
else
{ indexOfMin = 0; indexOfMax = 1;}
s = 2;
}
//比较剩余元素对
for (int i = s; i < n; i += 2)
{
if (a[i] < a[i + 1])
{
if (a[i] < a[indexOfMin])
{ indexOfMin = i; }
if (a[i + 1] > a[indexOfMax])
{ indexOfMax = i + 1;}
}
else
{
if (a[i+1] < a[indexOfMin])
{ indexOfMin = i+1; }
if (a[i] > a[indexOfMax])
{ indexOfMax = i; }
}
}
return true;
}
介绍一种高效的非递归算法,用于寻找数组中的最小值和最大值。该算法通过两两比较的方式减少比较次数,并针对数组长度的奇偶性进行优化。
717

被折叠的 条评论
为什么被折叠?



