找出包含n个元素的数组中的最小值和最大值。最简单的方法就是独立的使用n-1次循环,然后分别得到最小值和最大值,如是这样的,共用了2n-2次比较。
但是我们可以使用比较次数更低的方法来找出最小值和最大值。方法如下:
先将一对元素互相进行比较,然后把最小值跟当前最小值进行比较,把最大值跟当前最大值进行比较。,因此每两个元素需要3次比较。
如果n 为奇数,那么比较的次数是 次比较。如果n 为偶数,那么比较的次数是3n/2-2次比较。因此,不管是n是奇数还是偶数,比较的次数至多是. 具体的c# 代码如下:
public void LookMinMaxElement(Int32[] a,ref Int32 min,ref Int32 max)
{
for (int i = 0; i <= a.Length - 1; i+=2)
{
if (!(i + 1 >= a.Length))
{
if (a[i] < a[i + 1])
{
if (a[i] < min)
{
min = a[i];
}
if (a[i + 1] > max)
{
max = a[i + 1];
}
}
else
{
if (a[i + 1] < min)
{
min = a[i + 1];
}
if (a[i] > max)
{
max = a[i];
}
}
}
}
}
测试代码如下:
[TestMethod()]
public void LookMinMaxElementTest()
{
MinMaxElement target = new MinMaxElement(); // TODO: Initialize to an appropriate value
int[] a = new Int32[12] { 13, 19, 9, 5, 12, 8, 7, 4, 21, 2, 6, 11 };
Int32 min = Int32.MaxValue;
Int32 max = Int32.MinValue;
target.LookMinMaxElement(a, ref min, ref max);
Assert.AreEqual(2, min);
Assert.AreEqual(21, max);
a = new Int32[3] { 1,1,1};
min = Int32.MaxValue;
max = Int32.MinValue;
target.LookMinMaxElement(a, ref min, ref max);
Assert.AreEqual(1, min);
Assert.AreEqual(1, max);
}