Сортировка нескольких массивов одновременно

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сортировка нескольких массивов одновременно

Сообщение XPAHuTEJIb » 13.07.2006 (Чт) 14:26

Целый день потратил на поиск, так ничего и не нашёл, кроме сообщений типа "поюзай поиск(гугл, яндех, и т.п.)

Вопрос:
Есть текстовый файл - БД
Загружается в несколько массивов

к примеру:
смещение 1, 40 символов -Фамилия Имя Отчество
подпрограмма отделяет Фамилию Имя и Отчество по разным массивам
смещение 42, 10 символов - десятизначный номер - свой массив
смещение 53, 30 символов - адрес - 2 массива
1 адрес
2 признак (ну допустим 5 символов станции метро или района города)
Вот.
Сам вопрос:
Необходимо отсортировать:
1. Сначала по этим 5 символам адреса
2. По фамилии в пределах 5 символов или по номеру

Сортирую типа пузырьком, делаю на 10 прогонов больше чем размер массивов.....ну очень долго....может возможно загружать не в массивы а как-то в БД и сортировать БД?

Всякие разнве типы сортировок массивов у меня есть...:)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.07.2006 (Чт) 14:31

Да ради бога.
Код: Выделить всё
Dim rs As New ADODB.Recordset
rs.Fields.Append "FIO", adVarChar, 1000
rs.Fields.Append "Address", adVarChar, 1000
.....
rs.Open
'заполняем рекордсет
rs.Sort = "FIO, Address"
Лучший способ понять что-то самому — объяснить это другому.

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 13.07.2006 (Чт) 14:36

сеньк, попробую

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 13.07.2006 (Чт) 14:43

2Antonariy: ты чего?!

Код: Выделить всё
Select SuperField from SuperTable order by mid(SuperField, 53, 5), mid(SuperField, 1, 5)

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 13.07.2006 (Чт) 14:45

как сиквел вживить в вб?

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 13.07.2006 (Чт) 14:47

XPAHuTEJIb писал(а):как сиквел вживить в вб?

:shock:

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 13.07.2006 (Чт) 14:52

да ладно, объясните дураку, как с БД работать в васике :roll:

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 13.07.2006 (Чт) 15:00


Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.07.2006 (Чт) 15:06

Nicky, это ты чего? Вопрос перечитай. Какой еще селект? Он из текстового файла данные грузит. Нет, конечно можно подключить текстовый файл через DSN, но откуда ты знаешь в каком он формате? Может ODBC его не поймет.
Лучший способ понять что-то самому — объяснить это другому.

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 13.07.2006 (Чт) 15:13

Тогда сначала определимся, БД ор нот БД? А автору просьба не путать понятия! :)

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 13.07.2006 (Чт) 17:08

Antonariy, прикольно...

Аффтар пузырек не самый быстрый способ сортировки

http://algolist.manual.ru/sort/index.php уже классика...
Пора уже всем хорошим людям собраться и убить всех плохих людей.

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 14.07.2006 (Пт) 6:05

2Nicky:
смотря что считать базой данных....я считаю, что некая повторяющаюся последовательность данных с определёнными чётко границами полей является базой данны, не важно в каком виде она представлена...

2GB826:
я в курсе, я ж в теме написал, что вкурсе способов сортировки...и кстати там же написано, что это не совсем пузырёк, а модифицированый пузырь :)
но для целей сортировки это не так важно....когда у тебя десяток другой массивов, и в каждом по 2-3 тыщи записей, хоть как сортируй - разницы большой не будет, поэтому я и спрашиваю, возможно ли загрузить данные не в массивы(распихать), а как-то по другому, чтобы ускорить сортировку

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 14.07.2006 (Пт) 6:42

XPAHuTEJIb писал(а):2Nicky:
смотря что считать базой данных....я считаю, что некая повторяющаюся последовательность данных с определёнными чётко границами полей является базой данны, не важно в каком виде она представлена...

Это я и имел в виду. Так у тебя база или нет? Запости кусок данных

XPAHuTEJIb писал(а):2GB826:
я в курсе, я ж в теме написал, что вкурсе способов сортировки...и кстати там же написано, что это не совсем пузырёк, а модифицированый пузырь :)
но для целей сортировки это не так важно....когда у тебя десяток другой массивов, и в каждом по 2-3 тыщи записей, хоть как сортируй - разницы большой не будет, поэтому я и спрашиваю, возможно ли загрузить данные не в массивы(распихать), а как-то по другому, чтобы ускорить сортировку

Глубоко-о-о заблуждаешься 8)

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 14.07.2006 (Пт) 7:09

1234567890 Иванов Иван Иванович НУР_Юбилейный 1.3.25
9987456123 Петров Иван Степанович МСК_Ленинский 125.22

запостить кусок реального файла не могу, но структура типа такой

здесь неправильно отобразилась структура, суть в том, что под каждое поле отделено определённое колтчество символов

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 14.07.2006 (Пт) 8:12

Диагноз: БД

marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

Сообщение marvan » 14.07.2006 (Пт) 9:39

А давайте время сравним?
Вот пример сортировки многомерного массива по нескольким колонкам.
Использовал сортировку вставками с индексным массивом.
У меня стойкое ощущение, что возня с ADO займёт больше времени, попробуйте убедить меня в обратном.

Код: Выделить всё
Option Explicit

Public a() As String
Public P() As Long
Public lRowNum As Long
Public lRowCnt As Long
Public lColNum As Long
Public lColCnt As Long

Public Sub Main()
    Dim r As Long
    Dim c As Long
    Dim i As Long
    Dim j As Long
    Dim n As Long
    Dim s As String
    lRowNum = 0
    lColNum = 0
    lRowCnt = 30
    lColCnt = 3
    ' создаём массив с тестовыми данными
    ReDim a(lRowNum To lRowCnt, lColNum To lColCnt) As String
    ReDim P(lRowNum To lRowCnt) As Long
    For r = lRowNum To lRowCnt
        For c = lColNum To lColCnt
            'j = (8 * Rnd) + 1 ' тест длинных строк
            j = 1
            ' n = 31 ' весь алфавит
            n = 4
            s = vbNullString
            For i = 1 To j: s = s & Chr$((n * Rnd) + 192): Next
            a(r, c) = s
        Next
        P(r) = r
    Next
   
    Debug.Print "массив до сортировки"
    For r = lRowNum To lRowCnt
        s = P(r) & ":"
        For c = lColNum To lColCnt
            s = s & vbTab & a(P(r), c)
        Next
        Debug.Print s
    Next
   
    ' сортировка
    For i = 3 To 0 Step -1
        pInsertStr lRowNum, lRowCnt, a, P, i, True
    Next
   
    Debug.Print "массив после сортировки"
    For r = lRowNum To lRowCnt
        s = P(r) & ":"
        For c = lColNum To lColCnt
            s = s & vbTab & a(P(r), c)
        Next
        Debug.Print s
    Next
End Sub

Private Sub pInsertStr(l As Long, r As Long, a() As String, P() As Long, c As Long, fAsc As Boolean)  '
    Dim LP               As Long
    Dim RP               As Long
    Dim TMP              As Long
    Dim T                As String

    For RP = l + 1 To r
        TMP = P(RP)
        T = a(TMP, c)

        For LP = RP To l + 1 Step -1
            If T < a(P(LP - 1), c) Then P(LP) = P(LP - 1) Else Exit For
        Next LP
        P(LP) = TMP
    Next RP
End Sub


XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 14.07.2006 (Пт) 12:19

ну что сказать...сенька
сортировка 2-х мерного массива с (3000,30) элементов заняла меньше минуты.

marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

Сообщение marvan » 14.07.2006 (Пт) 12:49

Чтобы учитывался порядок сортировки надо вместо
Код: Выделить всё
If T < a(P(LP - 1), c) Then P(LP) = P(LP - 1) Else Exit For

сделать так
Код: Выделить всё
If (T < a(P(LP - 1), c))  Xor fAsc Then P(LP) = P(LP - 1) Else Exit For


сортировка 2-х мерного массива с (3000,30) элементов заняла меньше минуты.

издеваемся?
У меня это занимает пол секунды.

marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

Сообщение marvan » 14.07.2006 (Пт) 13:22

Опс.. Пол секунды было на (3000,2), на (3000,30) получилось 9сек.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 91

    TopList