Сортировка массива в порядке убывания с использованием Visual Basic в VS2012 - PullRequest
0 голосов
/ 21 мая 2018

Я делаю программу, которая случайным образом генерирует числа в 100 строк по 15 в ListBox с помощью нажатия кнопки.Мне нужно, чтобы он сортировался от КРУПНЕЙШЕГО к МАЛЕНЬКОМУ, слева направо по строкам.У меня есть пузырьковая сортировка, но она сортируется по наименьшему и только по первому столбцу.

Вот как я получаю сгенерированные числа:

 Private Sub btnGen_Click(sender As Object, e As EventArgs) Handles btnGen.Click
    'Number Generator
    Dim rn As New Random()
    Dim array(14) As Integer      
    Dim temp As Integer
    Dim st As String

    For y As Integer = 1 To 100
        For x As Integer = 1 To 15
            array(x - 1) = rn.Next(100, 1000)
        Next
        txtList.Items.Add(ats(array))
    Next
    st = st & vbNewLine

    Call sort()

    Using fs As New FileStream(My.Settings.DAT_PATH, FileMode.Append, FileAccess.Write)
        Using sw As New StreamWriter(fs)
            sw.WriteLine()
        End Using
    End Using

End Sub

Function ats(ar As Integer()) As String
    'FUNCTION for array to string seperated by comma
    Dim sb As New System.Text.StringBuilder
    For x As Integer = 0 To UBound(ar)
        If x = UBound(ar) Then
            sb.Append(ar(x).ToString)
        Else
            sb.Append(ar(x).ToString & ", ")
        End If
    Next
    Return sb.ToString
End Function

Вот как я их сортирую:

 Sub sort()

    'bubble sort from biggest to smallest 
    txtList.Sorted = True
    Dim array(14) As Integer
    Dim temp As Integer
    For ipass = 1 To UBound(array)
        For i = 0 To UBound(array) - 1
            If array(i) > array(i + 1) Then
                temp = array(i)
                array(i) = array(i + 1)
                array(i + 1) = temp
                array.Reverse()
            End If
        Next i
    Next ipass
End Sub

Наконец, вот пример моеготекущие результаты:

107, 512, 139, 233, 582, 460, 698, 231, 395, 724, 717, 284, 699, 419, 825

119, 214, 513,382, 538, 161, 431, 603, 573, 354, 757, 307, 204, 906, 200

124, 493, 153, 507, 675, 878, 698, 911, 625, 171, 915174, 270, 629, 770

126, 585, 480, 317, 731, 193, 385, 143, 152, 374, 246, 124, 205, 347, 936

139, 497, 422, 381, 127, 968, 236, 637, 406, 758, 594, 944, 929, 733, 428

Любая помощь будет оценена

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Вот альтернативное решение с использованием выделенного класса.

Метод Input() принимает логический переключатель, который позволяет сортировать List(Of Integer) по возрастанию или убыванию.
The Output() метод вернет массив String(), который может быть передан в ListBox, используя его метод .AddRange().
Свойство Delimiter можно использовать для указания компонентов строки (целочисленные значения в этом случае) должны быть разделены.

Private Class SortedLists
    Private OutputList As List(Of String)

    Public Sub New()
        OutputList = New List(Of String)
        Delimiter = ", "
    End Sub

    Public Property Delimiter As String

    Public Sub Input(Values As List(Of Integer), Ascending As Boolean)
        If Ascending Then
            Values.Sort()
        Else
            Dim IValues As IOrderedEnumerable(Of Integer) = Values.OrderByDescending(Function(i) i)
            Values = IValues.ToList()
        End If

        OutputList.Add(String.Join("", Values.
                              Select(Function(val, i) (val.ToString &
                              If(i < Values.Count - 1, Delimiter, "")))))
    End Sub

    Public Function Output() As String()
        Return OutputList.ToArray()
    End Function
End Class

Реорганизованная процедура создает список случайных целых чисел, добавляет строковые результаты в элемент управления ListBox, сохраняет строки в файл.
Истекшее времядля всей процедуры, рассчитанной с StopWatch, составляет 7 ~ 9 миллисекунд.
При использовании File.WriteAllLines() истекшее время составляет 10 ~ 14 миллисекунд.

Dim rn As New Random()
Dim MySortedLists As New SortedLists
Dim MyIntegerList As New List(Of Integer)

For y As Integer = 1 To 100
    For x As Integer = 1 To 15
        MyIntegerList.Add(rn.Next(100, 1000))
    Next
    MySortedLists.Input(MyIntegerList, False)
    MyIntegerList.Clear()
Next

txtList.Items.AddRange(MySortedLists.Output())

'File.WriteAllLines is a little slower, but it's easier to read
File.WriteAllLines(My.Settings.DAT_PATH, MySortedLists.Output)


'Using fs As New FileStream(My.Settings.DAT_PATH, FileMode.Append, FileAccess.Write)
'    Using sw As New StreamWriter(fs)
'        For Each line As String In MySortedLists.Output
'            sw.WriteLine(line)
'        Next
'    End Using
'End Using
0 голосов
/ 21 мая 2018

Я следовал твоему "образу жизни".Вы должны знать, что есть лучшие способы достичь того, чего вы хотите.

Private Sub btnGen_Click(sender As Object, e As EventArgs) Handles btnGen.Click
    'Number Generator
    Dim rn As New Random()
    Dim array(14) As Integer
    Dim temp As Integer
    Dim st As String

    For y As Integer = 1 To 100
        For x As Integer = 1 To 15
            array(x - 1) = rn.Next(100, 1000)
        Next
        'txtList.Items.Add(ats(array))
    Next

    Dim sortedArray = sort(array)



    Using fs As New FileStream(My.Settings.DAT_PATH, FileMode.Append, FileAccess.Write)
        Using sw As New StreamWriter(fs)
            For Each item In sortedArray
                sw.WriteLine(item)
            Next
        End Using
    End Using
End Sub

Function sort(array() As Integer) As IEnumerable(Of Integer)

    'bubble sort from biggest to smallest 
    txtList.Sorted = True

    Dim temp As Integer
    For ipass = 1 To UBound(array)
        For i = 0 To UBound(array) - 1
            If array(i) > array(i + 1) Then
                temp = array(i)
                array(i) = array(i + 1)
                array(i + 1) = temp

            End If
        Next i
    Next ipass
    Dim sortedArray = array.Reverse()
    Return sortedArray
End Function
...