Страница: 1 | 2 |
Вопрос: Как программно вкл/выкл List1.Sorte
Добавлено: 28.01.05 10:05
Автор вопроса:
VladeD
Ответы
Всего ответов: 29
Номер ответа: 16
Автор ответа: Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #16
Добавлено: 17.02.05 17:36
Ну да. Именно это и называется сортировкой вставками, сперва бинарный поиск по массиву сложностью O(log2N), потом сдвиг массива сложностью O(N).
Номер ответа: 17
Автор ответа: cresta
Вопросов: 117
Ответов: 1538
Профиль | | #17
Добавлено: 17.02.05 18:12
Эх, блин, как это по-русски
))
Ну вот смотри, неужели с qsort будет быстрее )))
В самом неблагоприятном случае ОДИН проход одного массива. И все. В благоприятном - всего одно сравнение.
Вся фишка в том, что данные не добавляются несортированной пачкой, а по одной строке.
Dim SA() As String 'массив строк (несортированный)
Dim PA() As Long 'массив индексов массива SA() (индексы в порядке возрастания строк)
Dim X As Long, i As Long
Private Sub Form_Load()
X = 0
End Sub
Private Sub Комманда1_Click()
ReDim Preserve SA(0 To X) 'добавляем строку в массив (в конце)
SA(X) = Text1.Text
ReDim Preserve PA(0 To X) 'добавляем в массив индексов индекс последнего
PA(X) = X
If X = 0 Then GoTo EndInsert 'первый элемент - ничего не вставляем
i = X
Do While StrComp(SA(X), SA(PA(i - 1)), vbTextCompare) < 0
PA(i) = PA(i - 1)
i = i - 1
If i = 0 Then Exit Do
Loop
EndInsert:
PA(i) = X
'проверяем, правильно вставлено или нет (должно выводить строки по алфавиту)
Debug.Print "-----------"
For i = 0 To X
Debug.Print SA(PA(i))
Next i
X = X + 1
End Sub
Private Sub cmdBySort_Click() 'заполнение листа по алфавиту
List1.Clear
For i = 0 To UBound(PA())
List1.AddItem SA(PA(i))
Next i
End Sub
Private Sub cmdByOrder_Click() 'заполненние листа в порядке поступления данных
List1.Clear
For i = 0 To UBound(PA())
List1.AddItem SA(i)
Next i
End Sub
Номер ответа: 18
Автор ответа: cresta
Вопросов: 117
Ответов: 1538
Профиль | | #18
Добавлено: 17.02.05 18:26
Для VladeD:
Забыл написать, что при нажатии кнопки Комманда1 строка добавляется из текстбокса Text1. Вся каша варится в цикле Do-Loop, остальное - вспомогательное типа проверок, заполнения листбокса и т.п.
Думаю разберешься.
Изначально предполагалось втыкать указатели на строки, затем подумал, что проще и быстрее будет с индексами элементов в строковом массиве. Тоже своего рода указатели, только не на память, а на массив SA()
Номер ответа: 19
Автор ответа: Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #19
Добавлено: 17.02.05 19:35
Эх, как бы тебе объяснить по другому, что то, что ты делаешь, называется сортировка вставками, и она относится к тем видам сортировок, которые, в отличие от пузырьковой, быстрой, минимаксовой и т.п., требуют дополнительной памяти?
Номер ответа: 20
Автор ответа: cresta
Вопросов: 117
Ответов: 1538
Профиль | | #20
Добавлено: 17.02.05 20:16
Я этих сортировок напробовался достаточно. Всяких. Знаю, что такое quicksort.Пробовал его и вдоль и поперек.
В задаче автора строки добавляются как я понял юзером, можно это представить так: Началась сортировка - прервалась до получения от юзера очередной строки - продолжилась - прервалась - снова продолжилась. Когда юзер закончит и пойдёт пить чай, закончится сортировка. Скорость ограничена скоростью набора текста на клавиатуре. Преимущества qsort я знаю, НО здесь они не работают. Потому что нет сразу всего объёма целиком.
А необходимость доп. памяти - это к чему? На что память? Кроме массива строк и массива указателей, на что ещё надо?
Номер ответа: 21
Автор ответа: Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #21
Добавлено: 17.02.05 20:40
У тебя на входе данные сортированы? Нет. На выходе? Да. Абсолютно неважно, как данные вводятся - из файла, с клавиатуры, из памяти, абсолютно неважно, как они выводятся - в файл, в консоль или в листбокс, то, что посередине - называется алгоритм сортировки. Предложенный тобой - алгоритм сортировки вставками.
Номер ответа: 22
Автор ответа: cresta
Вопросов: 117
Ответов: 1538
Профиль | | #22
Добавлено: 17.02.05 20:51
Ок, я же написал, что от начала и до конца работы программы - это сортировка. Состоит из отдельных шагов - вставок - инициируемых юзером.
А как ты предполагаешь использовать quicksort в данной задаче? И получить от него какие-либо преимущества. Набросай пару строк
Номер ответа: 23
Автор ответа: Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #23
Добавлено: 18.02.05 07:32
Поскольку здесь имеется разделение ввода во времени, юзать алгоритмы с дополнительным использованием памяти лучше, чем без него, поэтому квиксорт отдыхает. И вообще я придрался не к тому, что ты используешь сортировку вставками, а к тому, что ты написал, что сортировка не нужна.
Номер ответа: 24
Автор ответа: cresta
Вопросов: 117
Ответов: 1538
Профиль | | #24
Добавлено: 18.02.05 11:32
Sharp, ты злодей
Прекрасно понимаешь, что да как, и цепляешься
Номер ответа: 25
Автор ответа: Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #25
Добавлено: 18.02.05 13:53
Да, я такой. А еще у меня постов в 2 раза больше, чем у тебя
))
Номер ответа: 26
Автор ответа: cresta
Вопросов: 117
Ответов: 1538
Профиль | | #26
Добавлено: 18.02.05 14:01
Да, я тебя знаю, ты такой редиска.
А крестиком вышивать слабо?
Номер ответа: 27
Автор ответа: Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #27
Добавлено: 18.02.05 14:34
Когда-то умел, но сейчас, боюсь, не вспомню.
Номер ответа: 28
Автор ответа: sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #28
Добавлено: 19.02.05 12:28
Sharp, флэймер ты, вот ты кто
)
Номер ответа: 29
Автор ответа: Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #29
Добавлено: 19.02.05 15:43
"Ну надо же как-то себя развлечь" ©