在数组vb.net中交换位置

时间:2017-11-01 13:22:17

标签: arrays vb.net loops bubble-sort

我正在尝试编写一个包含两个部分的程序,具体取决于按下了哪两个按钮。

第一部分是工作位,用户按下标有“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

正如在代码中指出的那样,对这些数字进行排序的代码部分只是将它们按随机顺序排列而不是实际排序。

2 个答案:

答案 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作为第一行,它甚至会给你提供建议,告诉你需要做些什么才能把它放到第一行右。