Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
Заблокирован

Сортировка - поиск

15.10.2013, 08:41. Показов 2146. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нарисовал модуль, здесь ничего лишнего


Visual Basic
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
Option Explicit
 
Public Enum F_Compare
    [Числовые элементы] = 0
    [Текстовые элементы] = 1
    [По убыванию] = 2
    [Игнорировать регистр] = 4
    [Учёт длины элементов] = 8
End Enum
Private FMax As Long, j() As String, n&, s$
 
Public Function Find&(List As Variant, ByVal Elm As Variant, _
Optional Flag As F_Compare)
    'Бинарный поиск
    'Возврат положительного числа найденной позиции элемента в списке
    'Арг: Список // Элемент // Флаги сравнений
    Find = LBound(List)
    FMax = UBound(List)
 
1
    While FMax > Find
        Find = Fix((Find + FMax) / 2)
        On Compare(Elm, List(Find), Flag) + 1 GoTo 2, 3
        FMax = Find - 1
        GoTo 1
2
        Exit Function
3
        Find = Find + 1
    Wend
    Find = -1
End Function
 
Public Function Sort(List As Variant, Flag As F_Compare, Optional ByVal Min&, Optional ByVal Max& = -1) As Variant
    'Быстрая сортировка
    'Арг: Список // Флаги сравнений // [Нижний индекс] // [Верхний индекс]
    'Возвращаемое значение: Отсортированный список
    If Max < 0 Then Max = UBound(List)
 
    If TypeName(List) = "String()" Then
        j = List
        Sort_Str j, Flag, Min, Max
        Sort = j
    Else
        Sort = List
        Sort_Var Sort, Flag, Min, Max
    End If
End Function
 
Private Sub Sort_Str(List() As String, Flag As F_Compare, Min&, Max&)
    'Рекурсивный алгоритм быстрой сортировки
    Dim i1&, i2&
    If Max - Min < 1 Then Exit Sub 'Пройден весь список
    n = Fix((Max - Min + 1) / 5 + Min) 'Выбрать разделяющее значение.
    s = List(n)
    List(n) = List(Min) 'Переместить его вперед.
    i1 = Min: i2 = Max
 
    Do
 
        While Compare(List(i2), s, Flag) >= 0 'Просмотр сверху вниз от i2 до значения >= s
            i2 = i2 - 1
            If i2 <= i1 Then List(i1) = s: Exit Do
        Wend
        List(i1) = List(i2) 'Поменять местами значения i1 и i2.
        '-----------
        i1 = i1 + 1 'Просмотр снизу вверх от i1 до значения < s.
 
        While Compare(List(i1), s, Flag) < 0
            i1 = i1 + 1
            If i1 >= i2 Then i1 = i2: List(i2) = s: Exit Do
        Wend
        List(i2) = List(i1) 'Поменять местами значения i1 и i2.
    Loop
    '---------------------------------Сортировать два подсписка.
    On Error GoTo 1
 
    While List(i1) = List(i1 - 1) 'Сокращение диапазона поиска для Max
        i1 = i1 - 1
    Wend
    Sort_Str List, Flag, Min, i1
1
    On Error GoTo 2
 
    While List(i1) = List(i1 + 1) 'Сокращение диапазона поиска для Min
        i1 = i1 + 1
    Wend
    Sort_Str List, Flag, i1 + 1, Max
2
End Sub
 
Private Sub Sort_Var(List As Variant, Flag As F_Compare, Min&, Max&)
    'Рекурсивный алгоритм быстрой сортировки
    Dim i1&, i2&
    Static n&, v As Variant
    If Max - Min < 1 Then Exit Sub 'Пройден весь список
    n = Fix((Max - Min + 1) / 5 + Min) 'Выбрать разделяющее значение.
    v = List(n)
    List(n) = List(Min) 'Переместить его вперед.
    i1 = Min: i2 = Max
 
    Do
 
        While Compare(List(i2), v, Flag) >= 0 'Просмотр сверху вниз от i2 до значения >= v
            i2 = i2 - 1
            If i2 <= i1 Then List(i1) = v: Exit Do
        Wend
        List(i1) = List(i2) 'Поменять местами значения i1 и i2.
        '-----------
        i1 = i1 + 1 'Просмотр снизу вверх от i1 до значения < v.
 
        While Compare(List(i1), v, Flag) < 0
            i1 = i1 + 1
            If i1 >= i2 Then i1 = i2: List(i2) = v: Exit Do
        Wend
        List(i2) = List(i1) 'Поменять местами значения i1 и i2.
    Loop
    '---------------------------------Сортировать два подсписка.
    On Error GoTo 1
 
    While List(i1) = List(i1 - 1) 'Сокращение диапазона поиска для Max
        i1 = i1 - 1
    Wend
    Sort_Var List, Flag, Min, i1
1
    On Error GoTo 2
 
    While List(i1) = List(i1 + 1) 'Сокращение диапазона поиска для Min
        i1 = i1 + 1
    Wend
    Sort_Var List, Flag, i1 + 1, Max
2
End Sub
 
Public Function Compare&(Elm1 As Variant, Elm2 As Variant, ByVal Flag As F_Compare)
    'Улучшенная функция сравнения
    If Elm1 = Elm2 Then Exit Function
    On Flag GoTo 1, 2, 3, 2, 5, 2, 7, 2, 9, 2, 11, 2, 13, 2, 15
    Compare = (CDbl(Elm1) < CDbl(Elm2)) * 2 + 1
    Exit Function
2
    Compare = (CDbl(Elm2) < CDbl(Elm1)) * 2 + 1
    Exit Function
1
    Compare = StrComp(Elm1, Elm2, vbBinaryCompare)
    Exit Function
3
    Compare = StrComp(Elm2, Elm1, vbBinaryCompare)
    Exit Function
5
    Compare = StrComp(Elm1, Elm2, vbTextCompare)
    Exit Function
7
    Compare = StrComp(Elm2, Elm1, vbTextCompare)
    Exit Function
9
    Compare = Sgn(LenB(Elm1) - LenB(Elm2))
    If Compare = 0 Then Compare = StrComp(Elm1, Elm2, vbBinaryCompare)
    Exit Function
11
    Compare = Sgn(LenB(Elm2) - LenB(Elm1))
    If Compare = 0 Then Compare = StrComp(Elm2, Elm1, vbBinaryCompare)
    Exit Function
13
    Compare = Sgn(LenB(Elm1) - LenB(Elm2))
    If Compare = 0 Then Compare = StrComp(Elm1, Elm2, vbTextCompare)
    Exit Function
15
    Compare = Sgn(LenB(Elm2) - LenB(Elm1))
    If Compare = 0 Then Compare = StrComp(Elm2, Elm1, vbTextCompare)
    Exit Function
End Function





Добавлено через 18 минут
Чтоб небыло ошибки - несовпадения типов
Нужно правильно указать флаг
Примеры:
MyTextList = Sort(MyTextList, [Текстовые элементы])
или
MyTextList = Sort(MyTextList, [Текстовые элементы] + [По убыванию] + [Игнорировать регистр])

или
NumList = Sort(NumList, [Числовые элементы] + [По убыванию])
или
MyTextList = Sort(MyTextList, [Числовые элементы] + [Учёт длины элементов] + [По убыванию])

Комбинировать можно по разному, всё продуманно, но вы можете сделать мне замечание если что не так
4
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.10.2013, 08:41
Ответы с готовыми решениями:

1)Бинарный поиск 2)Сортировка включением 3)Шейкерная сортировка 4)Сортировка разделением
1)В заданном массиве К(N) найти индексы элементов, которые кратны минимальному значению элемента массива. 2)Задан массив AX (N). Добавить...

MyDictionary: сортировка по ключу, поиск значения по ключу, поиск ключа по значению
Задан интерфейс ІMyDictionary. Его реализует класс MyDictionary, который позволяет определить коллекцию пар &quot;ключ-значение&quot;. ...

Поиск/сортировка
Здравствуйте.Вот я вывожу из БД на страничку все записи.Как сделать еще две кнопки для поиска и сортировки?подскажите пожалуйста

4
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38177 / 21112 / 4307
Регистрация: 12.02.2012
Сообщений: 34,716
Записей в блоге: 14
22.11.2013, 11:16
JoraVoenyjHaker, что в данном контексте означает "многозадачный"?
0
Модератор
10055 / 3900 / 884
Регистрация: 22.02.2013
Сообщений: 5,851
Записей в блоге: 79
22.11.2013, 11:20
Цитата Сообщение от JoraVoenyjHaker Посмотреть сообщение
Самый быстрый
Быстрее qsort?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38177 / 21112 / 4307
Регистрация: 12.02.2012
Сообщений: 34,716
Записей в блоге: 14
22.11.2013, 11:26
Цитата Сообщение от The trick Посмотреть сообщение
Быстрее qsort?
- а там qsort и есть... Кстати, qsort не следует идеализировать: есть ситуации, когда, например, сортировка вставками будет работать быстрее.
0
Модератор
10055 / 3900 / 884
Регистрация: 22.02.2013
Сообщений: 5,851
Записей в блоге: 79
22.11.2013, 11:27
Цитата Сообщение от Catstail Посмотреть сообщение
- а там qsort и есть...
Я имел ввиду API функцию
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.11.2013, 11:27
Помогаю со студенческими работами здесь

Сортировка, поиск
После проведения спортивных соревнований, например, по футболу, и организаторы, и участники, и зрители особенно интересуются различной...

Сортировка и поиск
Сгенерировать массив (массив объявлять динамически) и вывести его на экран (Использовать при этом свою функцию для вывода массива на...

Сортировка. Поиск.
В однонаправленном массиве вычислить количество арифметических прогрессий с заданным приращением М, состоящих не менее чем из трех подряд...

сортировка и поиск
надо по сортировать числа 12 22 15 55 11 21 12 31 13 51 55 15 методом пузырька! в отсортированном массиве надо найти число и на какой...

Поиск и сортировка
Как сделать поиск и сортировку через ComboBox? Через DBEdit поиск и сортировка работает Данные вводятся в DBGrid с помощью DBComboBox и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru