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;
}
答案 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;
}