powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сортировка двумерного массива по нескольким полям
25 сообщений из 27, страница 1 из 2
Сортировка двумерного массива по нескольким полям
    #35234289
tolikt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VBA для Excel.
Двухмерный массив. Нужно отсортировать по нескольким полям. При одинаковых данных по всем полям сортировки порядок оставлять изначальный.
Т.е. полный аналог метода Sort для листа. Но без скидывания массива на лист, сортировки и обратной записи в массив. .
И главное - такой же быстрый, как метод Sort на листе.

Почему-то все самописные алгоритмы сортировки работают, но О-О-О-О-О-ОЧЕНЬ медленно!!! Здесь "алгоритм" имеется ввиду не метод (пузырёк, вставками, быстрая, Шелла и пр.), а именно реализация в VB(A). Или это уже проблема самого VB(A)?
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #35234323
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
toliktИли это уже проблема самого VB(A)?Как ты догадался?!
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #35234735
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: tolikt
> VBA для Excel.
> Двухмерный массив. Нужно отсортировать по нескольким полям. При
> одинаковых данных по всем полям сортировки порядок оставлять изначальный.
> Т.е. полный аналог метода Sort для листа. Но без скидывания массива
> на лист, сортировки и обратной записи в массив..
> И главное - такой же быстрый, как метод Sort на листе.
А почему бы не воспользоватся сбросом данных на лист?
не отсортировать быстрым сортом и обратно в массив ;-)
например так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Sub fgh()
Dim a( 1  To  1000 ,  1  To  10 ) As Long
Dim v() As Variant
Dim i As Long, j As Long
Dim r As Range
For i =  1  To  1000 
    For j =  1  To  10 
        a(i, j) = CLng(i * Rnd(j))
    Next j
Next i
Set r = ActiveSheet.Range("A1:J1000")
r.Value = a
r.Sort Key1:=Range("B1"), Order1:=xlAscending, Key2:=Range("D1") _
    , Order2:=xlDescending, Header:=xlGuess, OrderCustom:= 1 , MatchCase:= _
    False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, 
DataOption2 _
    :=xlSortNormal
v = r.Value
For i =  1  To  1000 
    For j =  1  To  10 
        a(i, j) = v(i,j)
    Next j
Next i

End Sub

Всего два полных прохода по массиву ;)
>
> Почему-то все самописные алгоритмы сортировки работают, но
> О-О-О-О-О-ОЧЕНЬ медленно!!! Здесь "алгоритм" имеется ввиду не метод
> (пузырёк, вставками, быстрая, Шелла и пр.), а именно реализация в VB(A).
> Или это уже проблема самого VB(A)?

Напиши на другом языке длл с функцией сортировки и сортируй там ;D

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #35237848
tolikt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь ГорбоносА почему бы не воспользоватся сбросом данных на лист?
не отсортировать быстрым сортом и обратно в массив ;-)1. Иногда не желательны лишние действия с данными на листе. Да и основное время уходит не на сортировку на листе, а на чтение/запись данных между массивом и листом.
2. Сортировка на листе имеет свои недостатки. Например, не учитывается дефис. Обсуждалось, в т.ч., и в теме Сортировка (косяк). Говорят, что есть возможность сортировки через Recordset, но у меня не получается записать в него данные массива: предложенные коды не работают. Может, тут помогут?


Игорь ГорбоносНапиши на другом языке длл с функцией сортировки и сортируй там ;DК сожалению, кроме скудных познаний в области VBA, других языков не знаю... :-((
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #35240199
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: tolikt
> Игорь Горбонос
> А почему бы не воспользоватся сбросом данных на лист?
> не отсортировать быстрым сортом и обратно в массив ;-)
> 1. Иногда не желательны лишние действия с данными на листе.

Делай эти действия на новом листе

> Да и основное время уходит не на сортировку на листе, а на
> чтение/запись данных между массивом и листом.

В моем варианте на лист передается одним действием:
r.Value = a
Внутренний механизм передачи я не знаю, но думаю, что он оптимизирован, на
уровне екселя. Из листа данные забираются тоже одним действием:
v = r.Value
Механизм передачи из ячеек в массив, тоже не знаю, но меня снова не
оставляют мысли об оптимизации на уровне екселя. Результат, правда,
получается типа вариант для этого и делался полный проход по массиву, для
преобразования к целевому типу, если устраивает вариант не преобразовуй и
оставляй как есть


> 2. Сортировка на листе имеет свои недостатки. Например, не
> учитывается дефис. Обсуждалось, в т.ч., и в теме Сортировка (косяк).

Приводи данные к виду в котором не будет косяков, и тут вдруг подумал, ты
хочешь сказать, что имеешь двухмерный массив строк ТАКОГО размера? Так не
имей такого массива, а заполняй сразу RecordSet и будет тебе расширенная
сортировка как говорят ;)

> Говорят, что есть возможность сортировки через Recordset, но у меня
> не получается записать в него данные массива: предложенные коды не
> работают. Может, тут помогут?

В RecordSet данные можно записать. Вместо заполнения массива, заполняй его.
Можно получить готовый - сделать запрос к листу с этими данными, выбирать
тебе.
Кода не дам, потому, что не понял, что и почему( скорострельность моего
примера достаточно высокая, а правильность сортировки всплыла после, и пока
я не вижу проблем и с ней ) тебя не устраивает в моем варианте

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #35241358
tolikt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь ГорбоносДелай эти действия на новом листеПри записи массива на лист и обратно могут возникнуть проблемы с форматом данных и прочие подводные камни. И нагромождать лишний код тут совсем не хочется.
Игорь ГорбоносВ моем варианте на лист передается одним действием:
r.Value = aТут я имел ввиду не о сложности кода записи массива данных на лист и обратно, а о времени.
Игорь ГорбоносПриводи данные к виду в котором не будет косяковТак ведь до конца и не понятно, какие косяки могут возникнуть. Тем более, если мне не нужно записывать промежуточные данные на лист и обратно.
В любом случае: НАДО ОБОЙТИСЬ БЕЗ ЗАПИСИ НА ДАННЫХ НА ЛИСТ . Только в самом конце и уже окончательные данные.
Игорь ГорбоносВ RecordSet данные можно записать. Вместо заполнения массива, заполняй его.Массив и так уже получен запросом через Recordset. Но проблема в том, что массив не один, а несколько и из разных источников. К тому же все возможные действия (суммирование, группировка, сортировка , отбор и т.п.), которые возможно сделать запросом, уже сделаны. И надо из массивов получить ещё выборку данных с сортировкой, суммированием и т.п.
Проблему записи данных из массива в Recordset описывал в другой теме, но пока предложенные варианты у меня не работают.
Проблему объединения двух и более Recordsetов в один тоже описывал, но тоже пока окончательно не решилось.
Игорь Горбоносхочешь сказать, что имеешь двухмерный массив строк ТАКОГО размераМассив не более чем 65536 строк. К тому же Access и прочие базы данных не знаю. Приходиться пользоваться только Excel.
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #35241507
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: tolikt
> В любом случае: НАДО ОБОЙТИСЬ БЕЗ ЗАПИСИ НА ДАННЫХ НА ЛИСТ. Только в
> самом конце и уже окончательные данные.

Тогда и вариантов нет :) , медленно сортируй в памяти

> Игорь Горбонос
> В RecordSet данные можно записать. Вместо заполнения массива,
> заполняй его.
> Массив и так уже получен запросом через Recordset. Но проблема в том,
> что массив не один, а несколько и из разных источников. К тому же все
> возможные действия (суммирование, группировка, сортировка, отбор и т.п.),
> которые возможно сделать запросом, уже сделаны. И надо из массивов
> получить ещё выборку данных с сортировкой, суммированием и т.п.

Делаешь RecordSet'у сортировку а потом пробегаешся по нему и сумируешь что
нужно
У тебя появляется и отсортированный набор данных и суммы чего нужно

Т.е. ты хочешь сказать что по полученным данным нужно проводить ещё
сумирование и группировку? не проще сделать новый запрос с нужными
сумированиями и сортировкой?

> Проблему записи данных из массива в Recordset описывал в другой теме,
> но пока предложенные варианты у меня не работают.
> Проблему объединения двух и более Recordsetов в один тоже описывал,
> но тоже пока окончательно не решилось.

Я бы сначала посмотрел какие данные и в каком объеме нужно будет
обрабатывать, после определения этих требований выбирал хранилище, которое
позволяет делать все это достаточно быстро, и после работал бы с этим
хранилищем. А у тебя получается, что данные приходят как RecordSet'ы, потом
ты их сливаешь в массивы, хотя можно попробовать слить на лист, а потом
начинаешь придумывать велосипед, как быстрее сделать сортировку и слияние.
Но это мое мнение и я не знаю всех влияющих факторов. Но в любом случае
обработка больших объемов данных дело не быстрое, показывай SplashScreen с
интерактивно изменяющимся ProgressBar'ом который будет показывать что
программа не болтается без дела, а работает, но с другой стороны это
увеличит время выполнения. Вообщем все ньюансы знаешь только ты и решать
тебе ;)
> Игорь Горбонос
> хочешь сказать, что имеешь двухмерный массив строк ТАКОГО
> размера
> Массив не более чем 65536 строк. К тому же Access и прочие базы
> данных не знаю. Приходиться пользоваться только Excel.

Может имеет смысл поучить Акцесс и поручить сортировки и слияние ему? Хотя
тебе даже не сколько Акцесс нужен, а работа с mdb базой через ADO, или через
что ты ходишь.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Сортировка двумерного массива по нескольким полям
    #36913765
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тоже интересно.

сразу скажу, с одномерным массивом уже сделано - и быстрее, чем сбрасывать на лист(гораздобыстрее - реализация qsort без рекурсии, и вообще разговоры про написать на другом языке несколько отвлечены от темы, в большинстве случаев VBA справляется нормально, вопрос правильного кода )

интересует именно сортировка по опред полю - пока вижу такой подход:

1 берем одномерный столбец( тот, по которому нужно сортировать)(вот тут лучше воспользоваться средствами не совсем VBA - функция copymemory из библиотеки kernel32 с этим справится быстрее)

2 создаем доп массив, равный получившемуся одномерному- он будет считаться заполненным порядковыми номерами элементов первого массива(1,2,3..) - т.е. изначально он упорядочен.

3 сортируем первый массив, одновременно выполняя те же преобразования над вторым

4 переписываем остальные поля двумерного массива в соответствии с порядком, получившимся в нашем дополнит массиве - например получилось 4,2,8,1.. -
заполняем двумерный массив arr(1 to n,1 to c) из первоначального массива arr_n с помощью нашего доп массива arr_r(1 to n)
Код: plaintext
1.
2.
3.
for i= 1  to n
..
arr(i,c)=arr_n(arr_r(i))
next

есть ли лучшие предложения? или где почитать?
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36913795
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_или где почитать?

я думаю, гуглеж по словам "алгоритмы сортировки массивов" даст массу данных, ибо народ на эту тему диссертации защищает
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36914037
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, не так просто - в основном все точно такие же вопросы..

нашел КНУТа, но это 30 лет назад..
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36914042
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Консилиум изобретателей велосипедов ))
Почему бы не воспользоваться рекордсетом? Он по-любому обгонит все доморощенные vba-алгоритмы.
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36914043
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к тому же в такой постановке точно заблудишься ибо будет в основном одномерная сортировка, а сней я уже вроде разобрался..
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36914052
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyКонсилиум изобретателей велосипедов ))
Почему бы не воспользоваться рекордсетом? Он по-любому обгонит все доморощенные vba-алгоритмы.

бла-бла

с одномерной не обогнал.. далеко не обогнал

ну как может обогнать, когда на запись время тратится?

доморощенный - не значит плохой, да и на доморощенном я не наставиваю - дайте проверенный, а на vba я сам его реализую
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36914061
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_ну как может обогнать, когда на запись время тратится?А массив откуда берется?
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36914063
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy, генерируется программой.
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36914064
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, Игорь уже все насоветовал, что я хотел.
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36914072
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy, медленно сортируй в памяти?

а что recordsets не в памяти? почему медленно?
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36914084
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: _slan_
> нашел КНУТа, но это 30 лет назад..

Ты надеешся что с тех пор что-то кардинально изменилось?
Вынужден тебя огорчить, что-бы получился ребёнок, по прежнему нужна женщина и мужчинаничего вообще не
поменялось. Хотя диссертаций защищено немало

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36914246
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_Antonariy, медленно сортируй в памяти?

а что recordsets не в памяти? почему медленно?Смысл вопросов от меня ускользнул.
Я имел ввиду, что он рекомендовал не использовать массив, а сразу создавать рекордсет, чтобы не тратить время на перегонку данных туда-сюда. Реализация сортировки в нем будет быстрее хотя бы потому, что сделана не на VBA. А то, что процедура, узко заточенная под конкретный одномерный массив, оказалась быстрее, к делу отношения не имеет, работаем-то с двумерным.
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36914679
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy_slan_Antonariy, медленно сортируй в памяти?

а что recordsets не в памяти? почему медленно?Смысл вопросов от меня ускользнул.
Я имел ввиду, что он рекомендовал не использовать массив, а сразу создавать рекордсет, чтобы не тратить время на перегонку данных туда-сюда. Реализация сортировки в нем будет быстрее хотя бы потому, что сделана не на VBA. А то, что процедура, узко заточенная под конкретный одномерный массив, оказалась быстрее, к делу отношения не имеет, работаем-то с двумерным.

смысл только в характере высказывания :)

Тогда и вариантов нет :) медленно сортируй в памяти

вот я и спрашиваю где расположены recordsets

а отношение имеет ибо надо получить производительность, а как вы правильно заметили, универсальные процедуры, хоть и написанные не на бэйсике(а в чем собственно разница? и в vba проект компилируется..) часто проигрывают узкозаточенным.

а почему массивы? так только потому, что это наиболее быстрый способ обращения к данным.. теоретически..
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36914695
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: _slan_
> нашел КНУТа, но это 30 лет назад..

Ты надеешся что с тех пор что-то кардинально изменилось?
Вынужден тебя огорчить, что-бы получился ребёнок, по прежнему нужна женщина и мужчинаничего вообще не
поменялось. Хотя диссертаций защищено немало

Posted via ActualForum NNTP Server 1.4

в методах работы с памятью? надеялся, что изменилось. А вдруг? вот теорему пуанкаре доказали..
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36914703
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_,
и вообще, мы вступаем на тропу общей полемики. А что скажете о предложенном алгоритме?

может кто знает какой алгоритм в методе sort листа используется? мож его улучшить.. :)
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36915109
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор(а в чем собственно разница? и в vba проект компилируется..) Во-первых не компилируется, во-вторых, при прочих равных код, скомпилированный из c++, будет быстрее хотя бы потому, что не зависит от виртуальной машины VB, через которую работают все функции и половина vb-операторов. А такое ответственное дело, как сортировка, в рекордсете наверняка реализована на ассемблере.

автора отношение имеет ибо надо получить производительность, а как вы правильно заметили, универсальные процедуры, хоть и написанные не на бэйсике часто проигрывают узкозаточенным.Ну получили вы в ней производительность, что дальше? В рамочку и на стену? Ведь поставленную задачу она не решает.

автортак только потому, что это наиболее быстрый способ обращения к данным.. теоретически..Вот именно, что теоретически. А практически подкачивают средства манипуляциями массивами.

авторвот я и спрашиваю где расположены recordsetsВ памяти. Только они с ней эффективней обращаются, чем VB.
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36915717
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по прежнему жду конструктивных предложений.
...
Рейтинг: 0 / 0
Сортировка двумерного массива по нескольким полям
    #36916393
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolikt VBA для Excel .
Двухмерный массив. Нужно отсортировать по нескольким полям. При одинаковых данных по всем полям сортировки порядок оставлять изначальный.
Т.е. полный аналог метода Sort для листа. без скидывания массива на лист , сортировки и обратной записи в массив.[/b].
И главное - такой же быстрый, как метод Sort на листе

Ну так и при чем здесь Excel???
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сортировка двумерного массива по нескольким полям
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]