Заблокирован

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

15.10.2013, 08:41. Показов 2172. Ответов 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
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
22.11.2013, 11:16
JoraVoenyjHaker, что в данном контексте означает "многозадачный"?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
22.11.2013, 11:20
Цитата Сообщение от JoraVoenyjHaker Посмотреть сообщение
Самый быстрый
Быстрее qsort?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
22.11.2013, 11:26
Цитата Сообщение от The trick Посмотреть сообщение
Быстрее qsort?
- а там qsort и есть... Кстати, qsort не следует идеализировать: есть ситуации, когда, например, сортировка вставками будет работать быстрее.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru