我正在编写一个程序,必须通过锦标赛支架找到最小的数字。例如,有一个数组
int[] a = new int[4] {4, 2, 1, 3}
通过比较彼此相邻的数字,我要选择最小的数字。 (min(4, 2) -> 2
,min(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。
最后一个问题:您打算以最简单的方式做什么?我几乎找不到有关此算法的任何信息。我希望你能将我的思想引向工作算法。
不多,但我发布了我的代码:
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;
}
你能指出我做得好吗,应该改进什么?
答案 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#可用的内置函数的“最简单”。如果这是家庭作业,请发布一些代码。
作为一个总体方向,使用递归函数可能是最优雅的(并且对合并排序的一些一般性阅读对你来说将是有用的。)