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

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

15.10.2013, 08:41. Показов 2128. Ответов 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
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
22.11.2013, 11:16
JoraVoenyjHaker, что в данном контексте означает "многозадачный"?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
22.11.2013, 11:20
Цитата Сообщение от JoraVoenyjHaker Посмотреть сообщение
Самый быстрый
Быстрее qsort?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
22.11.2013, 11:26
Цитата Сообщение от The trick Посмотреть сообщение
Быстрее qsort?
- а там qsort и есть... Кстати, qsort не следует идеализировать: есть ситуации, когда, например, сортировка вставками будет работать быстрее.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru