0

私は現在、ソートプログラムを構築しています。配列を作成する 3 つの異なる方法を作成しました: RandomIn OrderおよびReverse. In Order現在、およびReverse配列で問題が発生しています。配列が作成されるたびIn Orderに で始まりますが、1どうしてそうしているのかわかりません。また、私のReverse配列は、毎回ではなく、数回クリックした後に、数字を順不同で表示します。この 2 つの問題を解決するにはどうすればよいですか?

namespace sortingMachine
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //Class Level Variables --------------------------------------------------------------------------------------

        Stopwatch sw = new Stopwatch();
        Random r = new Random();
        OpenFileDialog open1 = new OpenFileDialog();

        long operations = 0;
        int size;
        int max;
        int[] createArray;
        int[] sortArray;
        int[] copyArray;

        //Create Array Methods --------------------------------------------------------------------------------------

        public void RandomNumber()
        {
            size = Convert.ToInt32(textBoxSize.Text);
            max = Convert.ToInt32(textBoxMax.Text);
            createArray = new int[size];
            copyArray = new int[size];
            sortArray = new int[size];

            for (int i = 0; i < size; i++)
            {
                createArray[i] = r.Next(1, max);
            }

            textBoxResults.AppendText("-------------------------------------------------------------------------------" + Environment.NewLine + "Random" + Environment.NewLine + Environment.NewLine);

            DisplayArrays();
        }

        public void InOrder()
        {
            size = Convert.ToInt32(textBoxSize.Text);
            max = Convert.ToInt32(textBoxMax.Text);
            createArray = new int[size];
            copyArray = new int[size];
            sortArray = new int[size];

            createArray[0] = 1;

            for (int i = 1; i < size; i++)
            {
                createArray[i] = createArray[i - 1] + r.Next(1, max);
            }

            for (int i = 1; i < size; i++)
            {
                if (r.Next(1, 101) < Convert.ToInt32(textBoxPercentage.Text))
                {
                    for (int x = 1; x < size; x++)
                    {
                        createArray[x] = r.Next(1, createArray[size - 1]);
                    }
                }
            }

            textBoxResults.AppendText("-------------------------------------------------------------------------------" + Environment.NewLine + "In Order" + Environment.NewLine + Environment.NewLine);

            DisplayArrays();
        }

        public void ReverseOrder()
        {
            size = Convert.ToInt32(textBoxSize.Text);
            max = Convert.ToInt32(textBoxMax.Text);
            createArray = new int[size];
            copyArray = new int[size];
            sortArray = new int[size];

            createArray[size - 1] = 1;

            for (int i = size - 1; i > 0; i--)
            {
                createArray[i - 1] = createArray[i] + r.Next(1, max);
            }

            for (int i = size - 1; i > 0; i--)
            {
                if (r.Next(1, 101) < createArray[0])
                {
                    for (int x = size - 1; x > 0; x--)
                    {
                        createArray[x] = r.Next(1, createArray[0]);
                    }
                }
            }

            textBoxResults.AppendText("-------------------------------------------------------------------------------" + Environment.NewLine + "Reverse Order" + Environment.NewLine + Environment.NewLine);

            DisplayArrays();
        }



        private void buttonCreateArray_Click(object sender, EventArgs e)
        {

            if ((textBoxSortKey.Text != "") && (textBoxCreateKey.Text != ""))
            {
                if (radioButtonRandom.Checked == true)
                {
                    RandomNumber();
                }

                if (radioButtonInOrder.Checked == true)
                {
                    InOrder();
                }

                if (radioButtonReverseOrder.Checked == true)
                {
                    ReverseOrder();
                }
            }
            else
            {
                MessageBox.Show("Type a key into the Key textbox.");
            }
        }



    }
}

表示結果:

順序配列が常に 1 から始まる理由がわかりません:

-------------------------------------------------------------------------------
In Order
1
2
4
6
10

逆順の配列が次のようになる場合があります。

-------------------------------------------------------------------------------

    Reverse Order
    10
    2
    7
    6
    5

Windows フォーム:

ここに画像の説明を入力

4

2 に答える 2

2

配列に値を割り当てる方法を見ると、最初の要素にゼロが割り当てられていることがわかりますが、ループでは 2 番目の要素 (つまり1) から開始するため、最初の要素を再割り当てすることはありません。

        createArray[0] = 1;

        for (int i = 1; i < size; i++)
        {
            createArray[i] = createArray[i - 1] + r.Next(1, max);
        }

最初の要素の割り当てを次のように書いてみてください。

        createArray[0] = r.Next(1, max);

あなたのリバース機能に関しては、あなたがやろうとしていることを実際に見るには奇妙さが多すぎます. 何度か考えてみてください。特に次のようなコードには注意してください: if (r.Next(1, 101) < createArray[0])- ランダムな動作とマジック ナンバーが含まれています。

于 2012-11-23T22:55:27.990 に答える
1

関数 InOrder では、配列の最初のインデックスを 1 に初期化します。逆順については、2 つの for の間のifステートメントで、1 から 101 までの乱数を配列の最初の数値と比較するたびに、 . 代わりにすべきことは、配列内の数値を互いに比較することです。

于 2012-11-23T22:42:46.047 に答える