Сортировка массива в памяти

Автор eeigor, 21 апреля 2022, 16:00

0 Пользователи и 1 гость просматривают эту тему.

eeigor

Есть ли возможность отсортировать массив в памяти при помощи SQL? В MS Office я бы использовал для этой цели объект ADODB.Recordset: создал бы пустой объект в памяти, заполнил его и отсортировал посредством SQL, потом забрал бы обратно методом getRows().
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Для Excel VBA указанный метод крайне не эффективен.

Для LO речь идет о Basic? О каком массиве?
Владимир.

eeigor

Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#3
Довольно быстро (обычно) можно загнать в диапазон ячеек, отсортировать, забрать обратно.
Либо взять один из методов быстрой сортировки массива на Basic (VBA), который возвращает массив индексов элементов в порядке возрастания значений этих элементов и поменять в тексте этого метода пару строк.
Например, этот (ему лет 20):

' lang:en
' Sort a one-dimensional array.
' - arr array (one-dimensional) returns an array of integers (index from 1) containing the indices of the Arr elements,
'   arranged in ascending order.
'
' The comparison is not case sensitive. If two elements have the same value, then the element with the lower index will follow first.
' If arr is not array, then returns False.
' lang:ru
' Сортировка одномерного массива.
' arr - массив (одномерный) возвращает массив целых чисел (индекс от 1), содержащий индексы элементов Arr,
' расположенных в возрастающем порядке.
' Сравнение производится без учета регистра. Если два элемента имеют одинаковое значение, то
' первым будет следовать элемент, имеющий меньший индекс.
' Если arr не является массивом, то возвращает False
Public Function QSort(ByVal arr As Variant) As Variant

   Dim i1 As Long, i2 As Long                        ' границы Arr
   Dim i As Long
   Dim k1 As Long, k2 As Long
   Dim w1, w2
   Dim IndSort() As Long
   Dim ind As Long

   Dim i_m, i_1, i_2 As Long

   If Not IsArray(arr) Then
       QSort = False
       Exit Function
   End If

   i1 = LBound(arr)
   i2 = UBound(arr)

   ind = i2 - i1 + 1

   ReDim IndSort(1 To ind)

   For i = 1 To ind
       IndSort(i) = i1 + i - 1
   Next i

   i_m = Int(ind / 2)

   While i_m > 0

       i_1 = i_m + 1


       While i_1 <= ind

           i_2 = i_1 - i_m

           Do While i_2 >= 1

               k1 = IndSort(i_2)
               k2 = IndSort(i_2 + i_m)

               w1 = arr(k1)
               w2 = arr(k2)

               If VarType(w1) = vbString Then
                   w1 = UCase(w1)
               End If

               If VarType(w2) = vbString Then
                   w2 = UCase(w2)
               End If

               If w1 > w2 Or (w1 = w2 And k1 > k2) Then    ' меняем местами индексы

                   IndSort(i_2) = k2
                   IndSort(i_2 + i_m) = k1

                   i_2 = i_2 - i_m

               Else
                   Exit Do
               End If

           Loop

           i_1 = i_1 + 1

       Wend

       i_m = Int(i_m / 2)
   Wend

   QSort = IndSort

End Function



Менять надо присвоения для w1, w2.
Владимир.