Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сортировка / 20 сообщений из 20, страница 1 из 1
23.07.2004, 18:41
    #32619526
Геронт II
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
Добрый день

Есть ли эффективные механизмы сортировки для VB6? Не хочется изобретать велосипед…

Что есть: набор пар значений Index1-String1, Index2-String2, …, IndexN-StringN.
Что требуется после сортировки: Index1-NewIndex1, Index2-NewIndex2, …, IndexN-NewIndexN. Где NewIndex – это соответствующий порядку сортировки индекс (натуральное число). Сортировка требуется алфавитная по значениям StringI. Пример:

Вход:
1-James
2-Alice
3-Mankurt

Результаты:
1-2
2-1
3-3

С уважением
Геронт II
...
Рейтинг: 0 / 0
23.07.2004, 20:22
    #32619616
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
Вопрос эффективной сортировки не в языке а в алгоритме.

Наиболее распространенным(эффективным) и часто используемым является QuockSort. Все конечно зависит от самого набора исходных данных , т.е. количества элементов и "разброса" элементов в нем. В некоторых случаях QiuckSort может быть медленне обычного BubbleSort'a.
Но все же я рекомендовал бы его, на больших обьемах ему практически нет равных.

Описаний полно в сети.

Magnus
...
Рейтинг: 0 / 0
23.07.2004, 23:15
    #32619720
Геронт II
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
Есть ли эффективные УЖЕ РЕАЛИЗОВАННЫЕ механизмы сортировки для VB6?
...
Рейтинг: 0 / 0
24.07.2004, 00:17
    #32619752
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
В Васике? Нету. Только у отдельных контролов.
Да и те можно переделать через АПИ. Если, к примеру, нужно отсортировать содержимое листбокса, то через АПИ делается одиним вызовом и летает.

Если же сортируешь свой массив. То ни реализовывать нужно самому. В принципе в реализации QuickSort ничего сложного нет.

Magnus
...
Рейтинг: 0 / 0
24.07.2004, 01:03
    #32619763
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
Если уж так лень написать свой QuickSort, то можно использовать ListBox
установив предварительно свойство Sorted=True

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 List1.AddItem "James"
   List1.ItemData(List1.NewIndex) =  1 
   List1.AddItem "Alice"
   List1.ItemData(List1.NewIndex) =  2 
   List1.AddItem "Mankurt"
   List1.ItemData(List1.NewIndex) =  3 
   
  For i =  0  To List1.ListCount -  1 
    Debug.Print i +  1 , List1.ItemData(i), List1.List(i)
  Next i

или же отсоединенный рекордсет
...
Рейтинг: 0 / 0
24.07.2004, 01:11
    #32619768
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
Но это уже будет через ж... За такие сортировки надо руки отрывать :)

ну там же на 10 минут работы!

Magnus
...
Рейтинг: 0 / 0
24.07.2004, 01:21
    #32619771
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
Magnus23Но это уже будет через ж... За такие сортировки надо руки отрывать :)

ну там же на 10 минут работы!

Magnus
Кипит наш разум возмущенный ?
Там на 10 , а тут на 1
P.S Я же сказал -способ для лентяев
...
Рейтинг: 0 / 0
24.07.2004, 01:33
    #32619772
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
А если 20К элементов? Можно будет на обед сходить!
Конечно кипит! Мне на работе не дают сделать так как я хочу, так хоть здесь... :)



Magnus
...
Рейтинг: 0 / 0
24.07.2004, 01:54
    #32619776
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
Если бы да кабы...
Пока я вижу только 3 шт. данных. А для них писать QuickSort-"Но это уже будет через ж... " :)
...
Рейтинг: 0 / 0
24.07.2004, 20:32
    #32620058
Геронт II
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
Мальчики, не ссорьтесь. И что самое смешное – мне надо сортировать колонки грида по их именам. Так чты если я еще для этого привлеку ЛистБокс то будет анально.

Помогите!
...
Рейтинг: 0 / 0
24.07.2004, 21:14
    #32620084
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
Тогда обычный пузырек. В чем проблема-то? За то время что ты ищешь "готовую" реализацию, можно было реализовать десяток алгоритмов.

Magnus
...
Рейтинг: 0 / 0
24.07.2004, 22:11
    #32620114
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
авторМальчики, не ссорьтесь.
мы не соримся.Обычный творческий обмен мнениями :)
авторИ что самое смешное – мне надо сортировать колонки грида по их именам

Тогда совсем не понял,в чем проблемы.В любом нормальном гриде сортировка ро столбцам реализуется автоматически
...
Рейтинг: 0 / 0
24.07.2004, 22:25
    #32620130
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
2 Геронт II
http://www.dmk.ru/files.php
Ищешь Visual Basic.Готовые алгоритмы

Скачиваешь .Ищешь примеры из главы 9 (посвящена сортировкам).Наслаждаешься...
...
Рейтинг: 0 / 0
25.07.2004, 08:21
    #32620205
Геронт II
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
Вы спасли мою репутацию и задницу. Очень обязан.
...
Рейтинг: 0 / 0
29.07.2004, 14:24
    #32627256
Геронт II
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
Взял реализацию QuickSort из 9 главы. Все супер, но проблема все-таки есть: алгоритм не инвариантен к последовательности входных данных потому что опирается на функцию rnd. Что я имею вввиду: пусть на входе

6
2
2
2
1
3

то восле сортировки

1
2
2
2
3
6

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

С уважением
Геронт II
...
Рейтинг: 0 / 0
30.07.2004, 11:36
    #32628893
Processor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
К Геронту II

Авва Геронт Петрский говорил: многие,..., блудодействовали мыслию
Ты "в натуре" проводишь сортировку по одному критерию, а "в мысли" подразумеваешь два (исходный порядок двоек).
Сортируй по двум критериям.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
09.01.2009, 23:03
    #35749308
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
Ой как слабо!
Я вот возьму и изобрету велосипед к вечеру.
...
Рейтинг: 0 / 0
10.01.2009, 00:12
    #35749357
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
Это самый простой самокат. Чтоб он стал велосипедом нудно еще один цыкл встроить.

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Private Sub Command1_Click()
  Dim PB_DataForSort1( 1000 ) As String
 
 Dim f As Long
 Dim FG As Long
 Dim n As Long
 Dim Rc As Long
 Dim A As Long
 Dim NAdr As Long
  'Допустим что у нас уже есть данные в масиве
   If File1.ListCount =  0  Then Exit Sub
   For f =  0  To File1.ListCount -  1 
     n = n +  1  'эта строчка тоит впереди, потому что нужен отступ, с 1 и ... Его можа сделать штучно PB_DataForSort1(f+1)=PB_DataForSort1(f) в цыкле с большего к меншему (for X=max-1 to min step -1)
     PB_DataForSort1(f) = File1.List(f)
   Next

'Примечание: Не буду изобретать очень сложный велосипед, тому настроюсь на числа и учту только первые 3 символа
'Сам процес очень прост! Гламурно - зато работает!
  For FG =  1  To  999 
    Rc =  0 
    For f = FG To  999 
      A = OcenkiForSort(PB_DataForSort1(f))
      If Rc < A Then Rc = A: NAdr = f ': Stop
    Next
   PB_DataForSort1(FG -  1 ) = PB_DataForSort1(NAdr)
   PB_DataForSort1(NAdr) = ""
  Next
  
  '*******   Показывю ********
  For FG =  1  To  1000 
    List1.AddItem PB_DataForSort1(FG)
  Next
End Sub

Private Function OcenkiForSort(Txt As String) As Long
Const Alfv = "АБВГДЕЄЖЗИІЙЇКЛМНОПРСТУФХЧЦШЩЮЯЬЁЫЪЭ0123456789QWERTYUIOPASDFGHJKLZXCVBNM-" ' Добавте что еще Вам нужно

Dim f As Long
For f =  1  To Len(Txt) ' Уровня Len(Alfv)^3 не должно быть больше as Long возможностей
  OcenkiForSort = OcenkiForSort + (Len(Alfv) - InStr(Alfv, Mid(UCase(Txt), f,  1 ))) ^ ( 4  - f)
  If f =  3  Then Exit For
Next
End Function

На практике:
...
Рейтинг: 0 / 0
10.01.2009, 00:14
    #35749359
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
sory (не то нажал)
На практике это выглядит так:
...
Рейтинг: 0 / 0
10.01.2009, 00:19
    #35749360
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка
Но хотелось б увидеть что-то по проще или чтоб быстрее работало. К примеру я работаю только с цыфрами (сортировка по рейтингу mp3 и создание ссилок), то вышеописанный пример как раз в тему без дополнительной функции "АБВГД..."
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сортировка / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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