0

私は、トーナメント ブラケットを通して最小の数を見つけなければならないプログラムを書いています。たとえば、配列があります

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

隣同士の数字を比較して、最小のものを選択する必要があります。( min(4, 2) -> 2min(1, 3) -> 1、そして 1 と 2 を比較しています。1 が最小なので勝者ですが、2 と 1 を比較することはできません。a[0] と1、a[2] と a[3]だけです。一般的に a[2*i] with a[(2*i)+1] for(int i=0; i<a.Length/2; i++)<- このようなもの

最初の質問: n 個の数がある場合、ツリー全体は 2n-1 個の括弧で構成されます。4 つまたは 7 つの要素の配列を作成する必要がありますか? 4 がより良いオプションのようです。

2 番目の質問: 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;
}

私がうまくやっている点と、何を改善すべきかを指摘できますか?

4

2 に答える 2

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# で利用可能な組み込み関数を使用した「最も単純な」アルゴリズムです。これが宿題である場合は、いくつかのコードを投稿してください。

一般的な方向性としては、再帰関数を使用するのが最も洗練されている可能性があります (また、マージ ソートに関する一般的な読み方は、今後に役立つことがわかります)。

于 2015-10-17T23:57:04.060 に答える