[英]Finding smallest number using tournament bracket
我正在編寫一個程序,該程序必須通過錦標賽括號找到最小的數字。 例如有一個數組
int[] a = new int[4] {4, 2, 1, 3}
通過比較彼此相鄰的數字,我必須選擇最小的數字。 ( min(4, 2) -> 2
, min(1, 3) -> 1
,然后我比較1和2,1是最小的,所以它是獲勝者,但是不可能比較2和1。只是[0]與1 ,A [2]與[3]等。在一般[2 * I]與[(2 * I)+1] for(int i=0; i<a.Length/2; i++)
<-像這樣的東西
第一個問題:如果有n個數字,則整個樹由2n-1個括號組成。 我應該創建一個包含4個或7個元素的數組嗎? 4似乎是一個更好的選擇。
第二個問題:如果我比較4和2,而2較小,我應該使a [0] = 2,然后在比較1和3時,使1 = 1嗎? 最后將a [0]與1進行比較,然后將最小的數字放入a [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;
}
您能指出我在做什么,應該改善什么?
如果必須使用比賽風格,那么遞歸方法似乎是最合適的:
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];
}
利用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-上面發布的算法是C#可用的內置函數中的“最簡單”。 如果這是一項家庭作業,請發布一些代碼。
作為一個總的方向,使用遞歸函數可能是最優雅的方法(並且對合並排序的一些一般性閱讀對您今后很有用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.