Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Сортировка массива


Автор: timich 4.3.2009, 07:17
Всем привет! 
Подскажите пожалуйста как отсортировать массив.
Есть Array.Sort(Мас7) , а как отсортировать в обратной последовательности??

Автор: -Mikle- 4.3.2009, 09:01
У Array.Sort(...) есть еще пареметр, принимающий интерфейс System.Collections.IComparer и подобные ему... юзай, и будет тебе счастье!

Автор: diadiavova 4.3.2009, 11:17
System.Collections.IComparer - очень полезная штука, когда нужна какая-нибудь специфическая сортировка. В данном же случае дотаточно будет использовать функцию Array.Reverse после сортировки. Она меняет порядок на противоположный.

Автор: timich 4.3.2009, 14:37
С System.Collections.IComparer разобраться не смог, а реверс, то что нужно.
Спасибо всем!

Автор: -Mikle- 4.3.2009, 15:32
Если массив большой, то вызов Array.Reverse будет занимать дополнительное время. Я не смотрел код метода Array.Reverse, но предполагаю, что там цикл длинной в половину размера массива.

А сортировка с указанием System.Collections.IComparer, столько же, сколько и сортировка без его указания (по умолчанию).

timich, если еще нужно, я выложу код здесь...

Автор: timich 4.3.2009, 16:41
Выкладывай конечно! Я же учусь))
Если можно с пояснениями.

Автор: -Mikle- 4.3.2009, 18:04
Ну вот:

Код

    ' Это массив Integer. Инициализируем его тестовыми значениями
    Private arr() As Integer = New Integer() {4, 26, 14, 8, 93, 2, 245}

    Private Sub TestSort()
        ' Сортируем массив.
        ' В качестве второго параметра передаем функцию, которая будет
        ' вызываться для сравнения двух значений
        Array.Sort(arr, AddressOf CompareValues)
    End Sub

    Private Function CompareValues(ByVal val1 As Integer, ByVal val2 As Integer) As Integer
        ' Результатом функции должно быть одно из трех значений
        ' (-1) - если val1 < val2
        ' (0)  - если val1 = val2
        ' (1)  - если val1 > val2

        ' прямая сортировка, сравниваем val1 с val2
        'Return val1.CompareTo(val2)

        ' обратная сортировка, сравниваем val2 с val1
        Return val2.CompareTo(val1)
    End Function


Думаю, что все более чем понятно! Если исключить все коментарии, то получится ровно три строчки кода. По моему, проще некуда  smile 
Тебе нужно скопировать отсюда только функцию CompareValues.

Автор: timich 4.3.2009, 23:01
Спасибо! Буду пробовать.

Автор: diadiavova 5.3.2009, 00:28
Цитата(-Mikle- @  4.3.2009,  15:32 Найти цитируемый пост)
Если массив большой, то вызов Array.Reverse будет занимать дополнительное время.

Ну дык...за удобство надо платить.

Цитата(-Mikle- @  4.3.2009,  18:04 Найти цитируемый пост)
Если исключить все коментарии, то получится ровно три строчки кода. По моему, проще некуда

Есть куда, можно и в две строчки
Код

    Private arr() As Integer = New Integer() {4, 26, 14, 8, 93, 2, 245}
    Private Sub TestSort()
        Array.Sort(arr, Function(a As Integer, b As Integer) b.CompareTo(a))
    End Sub

Автор: timich 5.3.2009, 00:33
Мне показалось, что не так.......(-1) - если val1 < val2
а вот так.....................................(-1) - если val1 > val2
ошибаюсь?

Автор: diadiavova 5.3.2009, 00:49
Вообще: эта функция должна возвращать отрицательное число, если первый аргумент имеет более высокий приоритет сортировки, 0 - если приоритеты равны, и положительное число - если второй аргумент имеет более высокий проритет(кажись так).
Более высокий приоритет означает, что в отсортированной коллекции элемент стоит раньше элементов с более низким приоритетом.

Для чисел такая функция может быть реализована так

Код

'Сортирует в порядке возрастания
Function CompareAsc(ByVal first As Integer, ByVal second As Integer) As Integer
    Return first - second
End Function

'Сортирует в порядке убывания
Function CompareDesc(ByVal first As Integer, ByVal second As Integer) As Integer
    Return  second - first
End Function

End Function


А вообще, почитай http://msdn.microsoft.com/ru-ru/library/system.collections.icomparer.compare.aspx.

Автор: timich 5.3.2009, 03:52
Большое спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)