簡體   English   中英

用比賽括號尋找最小的數字

[英]Finding smallest number using tournament bracket

我正在編寫一個程序,該程序必須通過錦標賽括號找到最小的數字。 例如有一個數組

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

通過比較彼此相鄰的數字,我必須選擇最小的數字。 min(4, 2) -> 2min(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM