使用锦标赛支架查找最小数字

时间:2015-10-17 23:40:12

标签: c# c++ algorithm sorting tournament

我正在编写一个程序,必须通过锦标赛支架找到最小的数字。例如,有一个数组

int[] a = new int[4] {4, 2, 1, 3}

通过比较彼此相邻的数字,我要选择最小的数字。 (min(4, 2) -> 2min(1, 3) -> 1,然后我比较1和2,1是最小的,所以它是赢家,但是不可能比较2和1.只有a [0]和{ {3}},a [2]带有[3]等等。一般来说,[2 * i]带有[(2 * i)+1] for(int i=0; i<a.Length/2; i++)&lt; - 类似这样的

第一个问题:如果有n个数字,则整个树由2n-1个括号组成。我应该创建一个包含4或7个元素的数组吗? 4似乎是一个更好的选择。

第二个问题:如果我比较4和2,并且2更小,我应该使[0] = 2,然后在比较1和3时1 = 1?最后将[0]与1进行比较并将最小数字与[0]相加?可能需要临时int。

最后一个问题:您打算以最简单的方式做什么?我几乎找不到有关此算法的任何信息。我希望你能将我的思想引向工作算法。

1

不多,但我发布了我的代码:

int[] a = new int[4] { 4, 2, 1, 3 };
int tmp = 0;
for (int i = 0; i < (a.Length)/2; i++)
{
    if (a[tmp] > a[tmp + 1])
    {
        a[i] = a[i + 1];
    }
    else if(a[tmp] < a[tmp +1])
    {
        a[i] = a[i + 1];
    }
    tmp = tmp + 2;
}

你能指出我做得好吗,应该改进什么?

2 个答案:

答案 0 :(得分:1)

如果锦标赛风格是必须的,那么递归方法似乎是最合适的:

int Minimum  (int [] values, int start, int end)
{
   if (start == end)
      return values [start];
   if (end - start == 1)
      if ( values [start] < values [end])
         return values [start];
      else
         return values [end];
   else
   {
      int middle = start + (end - start) / 2;
      int min1 = Minimum  (values, start, middle);
      int min2 = Minimum  (values, middle + 1, end);
      if (min1 < min2)
         return min1;
      else
         return min2;
   }
}

编辑:代码未经测试且错误可能已经滑入,因为它已在Android应用中输入。

编辑:忘了说你怎么称呼这个方法。像这样:

int min = Minimum  (myArray, 0, myArray.Length -1);

编辑:或者创建另一个重载:

int Minimum  (int [] values)
{
   return Minimum  (values, 0, values.Length -1);
}

只是打电话使用:

int min = Minimum  (myArray);

编辑:这里是非递归方法(请记住这个方法实际上修改了数组):

int Minimum(int[] values)
{
    int step = 1;
    do
    {
        for (int i = 0; i < values.Length - step; i += step)        
            if(values[i] > values[i + step])
                values[i] = values[i + step];
        step *= 2;
    }
    while(step < values.Length);

    return values[0];
}

答案 1 :(得分:0)

有各种简单的解决方案可以利用C#中设置的功能:

int min = myArray.Min();
//Call your array something other than 'a' that's generally difficult to figure out later

或者,这将通过所有值循环使用foreach。

int minint = myArray[0];
foreach (int value in myArray) {
  if (value < minint) minint = value;
}

1 - 你在说什么树?您的数组有n个值,因此它将具有n个最大值。如果你的意思是你要创建的所有数组中的值的数量是2n-1,它仍然不意味着你需要在1个数组中拟合所有这些,创建一个数组,使用它然后创建另一个数组。 C#GC将收集没有指针的引用类型的对象(不会再次使用),所以如果你担心这个问题,那将是很好的记忆吗?

2 - 发布您的代码。有一些陷阱,但你很可能会改变当前的数组值或创建一个新的数组。不需要Temp int。

3 - 上面发布的algos是使用C#可用的内置函数的“最简单”。如果这是家庭作业,请发布一些代码。

作为一个总体方向,使用递归函数可能是最优雅的(并且对合并排序的一些一般性阅读对你来说将是有用的。)