如何在显示C#中的步骤时对整数数组进行冒泡排序

时间:2016-10-25 21:50:59

标签: c# arrays winforms visual-studio bubble-sort

C#Visual Studio - Windows窗体应用程序

我正在尝试创建一个程序,该程序对一个种子的整数数组进行排序,并逐行显示每个步骤。该程序就是这样,但我希望它在完全排序后停止编写数组。例如,{1,4,5,2,6}的数组将显示如下:

          1  4  5  2  6
          1  4  2  5  6
          1  2  4  5  6
          1  2  4  5  6
          1  2  4  5  6

我希望它在第三行之后切断。这是当前的代码:

    int[] randArray = new int[5];
    private void btnLotto_Click(object sender, EventArgs e) {
        fillArray();
        sortArray();
    }
    private void fillArray() {
        Random random = new Random(int.Parse(txtSeed.Text));
        for (int i = 0; i < randArray.Length; i++) {
            int randomNumber = random.Next(1, 51);
            randArray[i] = randomNumber;
        }
    }
    private void displayArray() {
        for (int i = 0; i < randArray.Length; i++) {
            txtLotto.AppendText(randArray[i].ToString().PadRight(3));
        }
        txtLotto.AppendText("\r\n");
    }
    private void sortArray() {
        txtLotto.Text = "";
        for (int i = 0; i < randArray.Length; i++) {
            for (int j = 0; j < randArray.Length - 1; j++) {
                if (randArray[j] > randArray[j + 1]) {
                    swap(ref randArray[j], ref randArray[j + 1]);
                }
            }
                displayArray();
        }
    }
    private void swap(ref int a, ref int b) {
        int tempA = a;
        a = b;
        b = tempA;
    }

2 个答案:

答案 0 :(得分:4)

如果您只希望通过外循环每次运行显示一次,但如果没有更改则不想显示,则可以为其设置一个标志,并仅在适当时显示。

bool swapped = false;
for (int i = 0; i < randArray.Length; i++) {
    for (int j = 0; j < randArray.Length - 1; j++) {
        if (randArray[j] > randArray[j + 1]) {
            swap(ref randArray[j], ref randArray[j + 1]);
            swapped = true;
        }
    }
    if (swapped) {
        displayArray();
    }
}

<强>原始

我会修改代码,以便在交换后立即显示:

for (int i = 0; i < randArray.Length; i++) {
    for (int j = 0; j < randArray.Length - 1; j++) {
        if (randArray[j] > randArray[j + 1]) {
            swap(ref randArray[j], ref randArray[j + 1]);
            displayArray(); // Moved from outer for loop
        }
    }
}

这样只会在交换发生时重新显示。

答案 1 :(得分:1)

如果您在内部排序循环中进行任何交换,则需要存储。如果您没有进行任何更改,则列表会被排序,您可以退出。

displayArray();
for (int i = 0; i < randArray.Length; i++) {
        bool changed=false;
        for (int j = 0; j < randArray.Length - 1; j++) {
            if (randArray[j] > randArray[j + 1]) {
                swap(ref randArray[j], ref randArray[j + 1]);
                changed=true;
            }
        }            
        if(changed)
            displayArray();
        else
            break;
    }