Отсортированный список, индексы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ilya Vasilyev
Постоялец
Постоялец
 
Сообщения: 820
Зарегистрирован: 06.08.2002 (Вт) 5:36
Откуда: Russia, Omsk

Отсортированный список, индексы

Сообщение Ilya Vasilyev » 28.08.2003 (Чт) 10:23

У меня стоит след. задача:
есть файл-справочник, его значения неотсортированы, допустим

значение / позиция в файле
ab / 1
ef / 2
cd / 3

Надо список представить в отсортированном порядке, но при этом знать, какая запись в какой позиции в файле находится... завел два списка (к примеру) List1 (Sorted = True), и List2 (Sorted = False)
заполняю
List1.Add Value
List2.Add Pointer, List1.NewIndex
верно нет?

Получаем
значение / позиция в файле
ab / 1
cd / 3
ef / 2

Т.е. выбрали запись #1 (List1.ListIndex = 1), тогда
Pointer = List2.List(List1.ListIndex)
получаем Pointer = 3

Первый список отсортирован... при кол-ве записей =2, все ок, а вот когда записей больше 10, второй список содержит некорректные указатели... где искать трабл?

Все ли понятно я объяснил?
Изображение
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.08.2003 (Чт) 11:02

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

Ilya Vasilyev
Постоялец
Постоялец
 
Сообщения: 820
Зарегистрирован: 06.08.2002 (Вт) 5:36
Откуда: Russia, Omsk

Сообщение Ilya Vasilyev » 28.08.2003 (Чт) 11:25

GSerg
Я приводил строчку
List2.Add Pointer, List1.NewIndex

Она добавляет во 2-й список в место, в которое была добавлена последняя запись в 1-м списке...
Изображение
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.08.2003 (Чт) 12:24

Не используй ListBox для сортировки. Есть куча халявных алгоритмов сортировки, сортируй (только не данные, а индексы) и таких проблем не будет.
Lasciate ogni speranza, voi ch'entrate.

Ilya Vasilyev
Постоялец
Постоялец
 
Сообщения: 820
Зарегистрирован: 06.08.2002 (Вт) 5:36
Откуда: Russia, Omsk

Сообщение Ilya Vasilyev » 28.08.2003 (Чт) 13:56

Да, но если будет 1000 записей, быстрее только через список... мне не понятен принцип неправильного заполнения 2-го списка :?
Изображение
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 29.08.2003 (Пт) 6:32

Ты не прав. Спрашивал я как-то в трёпе, почему мой модуль для сортировки так быстро сортирует методом shell, и почему сортировка quick работает гораздо медленнее (в частности, для массива из примерно 5000 элементов время сортировки quick составляет примерно 2500 мсек, а shell справляется за 150 мсек.
Ща поищу этот модуль, мож пригодится...

Ага, вот он, держи. Юзай либо heap, либо shell.



vbskb_sort
Вложения
Sorting.zip
Шесть разных способов сортировки.
(5.61 Кб) Скачиваний: 146
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 29.08.2003 (Пт) 8:21

Есть такое свойство ItemData
Код: Выделить всё
  With List1
    .AddItem "ab"
    .ItemData(.NewIndex) = 1
    .AddItem "ef"
    .ItemData(.NewIndex) = 2
    .AddItem "cd"
    .ItemData(.NewIndex) = 3
  End With

И использование
Код: Выделить всё
Private Sub List1_Click()
  With List1
    Form1.Caption = "T=" & .List(.ListIndex) & " N=" & .ItemData(.ListIndex)
  End With
End Sub
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.10.2004 (Пт) 17:54

Тему в Трёпе я не нашёл :)

Так что поднимаем эту и сообщаем.
Сортировка Quick работает медленнее всех в VB потому, что сам факт вызова функции в VB весьма накладен, а из представленных алгоритмов это единственный, в котором более одного вызова. Если заменить QuickSort аналогичным, но выполненным в нерекурсивной форме, то скорость работы будет примерно вдвое выше, чем у того же Shell или Heap.
Основная идея: tyomitch. Ссылка на нерекурсивный quick - он же.
Так что вот.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


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

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

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

    TopList