我正在尝试编写一个包含两个部分的程序,具体取决于按下了哪两个按钮。
第一部分是工作位,用户按下标有“unsort”的第一个按钮,这会触发一个循环,显示一个输入框,要求一个随机数8次。这8个数字存储在一个数组中。
然而,这是我正在努力的第二部分;第二个按钮标记为排序,应输出用户刚刚输入的数字,第一个按钮是顺序,从最小到最大。我知道必须在这里使用冒泡排序,并且还必须使用循环中的循环,但是这是我不理解的这些循环的内容。从我原来的帖子开始,我编辑了帖子,在循环中包含了一些代码,我以前一直坚持使用,但它仍然没有产生所需的输出(所有数字按顺序),而只是输出看似随机的数字为了
代码在下面张贴了注释:
Public Class BubbleSort1
Dim Bubble(8) As Integer
Dim UnsortedList As String
Dim n As Integer
Dim SortedList As String
Dim temp As String
Private Sub btnUnsort_Click(sender As Object, e As EventArgs) Handles btnUnsort.Click
n = 8 ' number off values on array
For i = 1 To n ' when i is between 1 and size of array
Bubble(i) = InputBox("Enter Number") ' User inputs a number
UnsortedList = UnsortedList & " " & Bubble(i) & vbNewLine ' number is added to the unsorted list variable
Next i
lblUnsort.Text = UnsortedList ' outputs the array
End Sub
Private Sub btnSort_Click(sender As Object, e As EventArgs) Handles btnSort.Click
For i = 1 To n - 1 ' When i is between 1 and the array size - 1 (8-1):
For j = 1 To n - 1 ' Second loop - when j is between 1 and the array size - 1 (8-1):
If Bubble(j) > Bubble(j + 1) Then ' if bubble value j is greater than value j - 1:
temp = Bubble(j)
Bubble(j) = Bubble(j + 1) ' These lines are supost to order the numbers but aren'r currently doing so
Bubble(j + 1) = temp
SortedList = SortedList & Bubble(j) & vbNewLine ' Adding the number in order to a variable
End If
Next j
Next i
lblSort.Text = SortedList ' outputting the ordered numbers
End Sub
End Class
正如在代码中指出的那样,对这些数字进行排序的代码部分只是将它们按随机顺序排列而不是实际排序。
答案 0 :(得分:0)
如果要提示用户输入,那么首先需要使用像NumericUpDown这样的控件获取数值,或者需要使用Integer.TryParse将String值转换为Integer值。另外,请记住,VB.Net中的数组具有基于0的索引,因此它们从0开始,而不是从1开始。
就冒泡排序算法而言,您需要像 i 和 j 那样的嵌套循环,只需要内部嵌套循环(< em> j )需要从数组的开头迭代到第二个到最后一个项目(0到n-2)。在嵌套循环内部,您将比较当前迭代的值是否大于(或小于您想要交换的值)的值,而不是下一个值。如果是这样,那么您只需重新分配当前迭代索引的值。
这是一个我掀起的控制台应用程序示例,它不会提示用户输入随机值,而只是获取随机值的集合,然后执行冒泡排序:
Private Function BubbleSort(ByVal values() As Integer) As Integer()
'Declare placeholder variables to use in the iterations
Dim temp As Integer
For outterIndex As Integer = 0 To values.Length - 1
For innerIndex As Integer = 0 To values.Length - 2
If values(innerIndex) > values(innerIndex + 1) Then
temp = values(innerIndex + 1)
values(innerIndex + 1) = values(innerIndex)
values(innerIndex) = temp
End If
Next
Next
Return values
End Function
Private r As New Random()
Private Function RandomNumbers(ByVal range As Integer) As Integer()
'Throw an exception if the value is less than 1
If range < 1 Then Throw New ArgumentOutOfRangeException("The range cannot be less than 1")
'Return a collection of random numbers
Return Enumerable.Range(1, range).Select(Function(i) r.Next()).ToArray()
End Function
小提琴:Live Demo
答案 1 :(得分:0)
使用现在包含数组元素交换的更新代码,您构建的字符串过早显示已排序的数组:它将显示工作而不是最终结果。
您需要做的就是在数组按顺序构建字符串:
Private Sub btnSort_Click(sender As Object, e As EventArgs) Handles btnSort.Click
' Bubble sort the array...
For i = 1 To n - 1 ' When i is between 1 and the array size - 1 (8-1):
For j = 1 To n - 1 ' Second loop - when j is between 1 and the array size - 1 (8-1):
If Bubble(j) > Bubble(j + 1) Then ' if bubble value j is greater than value j - 1:
temp = Bubble(j)
Bubble(j) = Bubble(j + 1)
Bubble(j + 1) = temp
End If
Next j
Next i
'lblSort.Text = String.Join(vbNewLine, Bubble.Skip(1)) ' an easy one-liner
' Create a string to show the sorted array...
SortedList = "" ' clear it out in case it was used previously
For i = 1 To n
SortedList = SortedList & Bubble(i).ToString()
If i < n Then ' only add a newline if it isn't the last element
SortedList = SortedList & vbNewLine
End If
Next
lblSort.Text = SortedList
End Sub
我把.ToString()
放在那里,期待你明确地将输入字符串转换为数字;严格来说,&
运算符会将其参数转换为字符串,但我更倾向于在代码中使其显而易见。
正如您的代码所示,存在从输入(一串数字)到整数(数组元素的类型)的隐式转换。虽然这看起来很方便,但如果VB为您猜错了转换,则可能会出现问题。有一种方法告诉它让你知道变量的类型是否匹配:把Option Strict On
作为第一行,它甚至会给你提供建议,告诉你需要做些什么才能把它放到第一行右。