2016-01-15 3 views
2

У меня есть четыре целых числа, хранящихся в переменных. Каким образом можно найти самый большой, второй по величине, третий и самый маленький? Есть ли элегантный способ сделать это, не написав длинный код?Сортировка четырех целых чисел: VBA Excel

+1

Вы можете использовать функции SMALL и LARGE из Excel. –

+0

не могли бы вы интерпретировать это как пример кода? –

+0

Извинения, я понял вопрос как диапазон рабочего листа, а не 4 переменные. –

ответ

1

Наиболее элегантными и распространенными способами сортировки целых чисел являются алгоритмы Quicksort и Bubblesort.

Но если у вас есть только четыре целых числа, это может быть немного перебор. Таким образом, вы также можете реализовать простой алгоритм if-else.

Quicksort

Private Sub QuickSort(_ 
         ByRef ArrayToSort As Variant, _ 
         ByVal Low As Long, _ 
         ByVal High As Long) 
Dim vPartition As Variant, vTemp As Variant 
Dim i As Long, j As Long 
    If Low > High Then Exit Sub 
    vPartition = ArrayToSort((Low + High) \ 2) 
    i = Low: j = High 
    Do 
    Do While ArrayToSort(i) < vPartition 
     i = i + 1 
    Loop 
    Do While ArrayToSort(j) > vPartition 
     j = j - 1 
    Loop 
    If i <= j Then 
     vTemp = ArrayToSort(j) 
     ArrayToSort(j) = ArrayToSort(i) 
     ArrayToSort(i) = vTemp 
     i = i + 1 
     j = j - 1 
    End If 
    Loop Until i > j 
    If (j - Low) < (High - i) Then 
    QuickSort ArrayToSort, Low, j 
    QuickSort ArrayToSort, i, High 
    Elsea 
    QuickSort ArrayToSort, i, High 
    QuickSort ArrayToSort, Low, j 
    End If 
End Sub 

BubbleSort

For j = UBound(ArrayToSort) - 1 To LBound(ArrayToSort) Step -1 

    For i = LBound(ArrayToSort) To j 
     If ArrayToSort(i) > ArrayToSort(i + 1) Then 
     vTemp = ArrayToSort(i) 
     ArrayToSort(i) = ArrayToSort(i + 1) 
     ArrayToSort(i + 1) = vTemp 
     End If 
    Next i 
    Next j 

Code from german MSDN

+0

спасибо! не кажется легко понятным, но, но попробует! –

1

4 элементы могут быть отсортированы с использованием 5 если заявления/своп (сортировка сети):

if (a[0] > a[2]) { swap(a[0], a[2]); } 
    if (a[1] > a[3]) { swap(a[1], a[3]); } 
    if (a[0] > a[1]) { swap(a[0], a[1]); } 
    if (a[2] > a[3]) { swap(a[2], a[3]); } 
    if (a[1] > a[2]) { swap(a[1], a[2]); } 
+0

спасибо. Интересно, на каком языке написан код? И может ли метод «своп» использоваться в VBA для Excel, или есть альтернатива? –

+0

Это псевдокод или C++ с пространством имен std для функции swap. Чтобы поменять a и b, используя временную переменную t, используйте | t = a | a = b | b = t | , Вот [пример обмена VBA] (http://www.excel-easy.com/vba/examples/swap-values.html). – rcgldr

Смежные вопросы