同时找到数组中的最小值和最大值

找出包含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);

        }

posted @ 2010-10-24 21:30  chenping2008  阅读(2218)  评论(4编辑  收藏  举报