Страницы: 1
RSS
"Пузырьковая" сортировка одномерного массива, ошибка
 
Здравствуйте уважаемые профессионалы!

Просмотрел темы как делать сортировку, взялся за самую простую, как я понял она называется "пузырьковая" сортировка одномерного массива. При запуске почему-то выдаёт ошибку. Подскажите пожалуйста, в чём проблема? Саму сортировку прописал в отдельном макросе Private Sub SortArray() и вызываю в основном.
 
Глянул - нет времени всё править, слишком много косяков...
Массивы или делайте публичными, или передавайте в параметрах!
 
Во-первых Вы не передаете в SortArray никаких массивов. Дальше и говорить не о чем.
P.S. Так же у Вас в SortArray необъявленные и неправильно объявленные переменные.
Я сам - дурнее всякого примера! ...
 
Массивы объявлены локально и не видны в Sub SortArray,
в самой сортировке потом объявится выход за пределы массива.
 
kuklp, до запуска макроса сортировки, массив уже сформирован, зачем мне что-то куда-то передавать? Простите если вопрос глупый, может я что-то не понимаю
 
Цитата
Hugo написал:
Массивы или делайте публичными, или передавайте в параметрах!
 
Hugo, исправил некоторые глупые косяки, на счёт публичных массивов, не совсем понимаю как это сделать, получается надо объявить их вне макросов в начале?
 
Да, и уже что-то заработало.
tmp_massiv_tiparm оставьте as variant, ну или строковым типом - там ведь спотыкается на строке.
А дальше выход за пределы массива... В общем некогда всё править.
Изменено: Hugo - 28.07.2016 13:00:53
 
Цитата
Сливочный написал:
надо объявить их вне макросов в начале?
Да - в области деклараций: перед самым первым макросом в стандартном модуле.
 
Hugo, tmp_massiv_tiparm, tmp_massiv_dlin и tmp_massiv_kolichestva использую в качестве переменных при перестановке, зачем их делать массивом?
 
Не, массивом не надо, я поторопился, но исправился :)
Но с типами разберитесь. Ну и далее с размерностью массива.
Изменено: Hugo - 28.07.2016 13:06:52
 
Hugo, на счёт типов, все переменные используемые в макросе сортировки Private Sub SortArray() объявлены и объявлены корректно (исправил тип временных переменных используемых при перестановке Long на Variant, т.к. Long только для чисел, а у меня ещё текст есть). i и j объявлены корректно, больше переменных нет.
А на счёт размерности, ведь сортировка размерность массива не меняет а переставляет значения?
 
Ну так ведь выходит за предел массива - значит кто-то накосячил, и это не я :)
 
Hugo, нашёл косяк, исправил, сортировка работает, но не понимаю что это значит)

я представляю себе эту пузырьковую сортировку так:

(всего в моём массиве-примере 13 элементов)
(1-й шаг) значение i=1 в массиве сравнивается с последующим i=1+1=2 - выполняются манипуляции по условиям;
(2-й шаг) значение i=2 в массиве сравнивается с последующим i=2+1=3 - выполняются манипуляции по условиям;
....
(12 шаг) значение i=12 в массиве сравнивается с последующим i=12+1=13 - выполняются манипуляции по условиям;

т.е. строку в коде макроса от 1 до 12 я понимаю,
Код
For i = LBound(arr_massiv_dlin) To UBound(arr_massiv_dlin) - 1 ' от 1 до 12
а до неё не очень.. объясните пожалуйста.
Код
For j = LBound(arr_massiv_dlin) To UBound(arr_massiv_dlin) ' от 1 до 13
 
Прошу прощения, я дурак, разобрался зачем  :) по сути цикл FOR  с переменной j можно назначить самостоятельно но не меньше количества элементов массива, правда все итерации свыше количества элементов массива будут лишними.
 
Всем откликнувшимся огромное спасибо за ваше драгоценное время! Особенно Hugo,  :)
 
Что-то там вообще накрутили...
Вот простой пример использования такого пузырька:
Код
Sub tt()

    'Populate the array, sort and remove duplicates
    ReDim aArray(1 To Selection.Count)
    i = 1
    For Each c In Selection
        aArray(i) = c.Value
        i = i + 1
    Next
    SortArray aArray

MsgBox "Done"

End Sub
  
Private Sub SortArray(ByRef a As Variant)
    Dim i As Long, j As Long
    Dim t As Variant
  
    'standard bubble sort loops
    For i = LBound(a) To UBound(a) - 1
        For j = i + 1 To UBound(a)
            If a(i) > a(j) Then 'change to < for descending order
                t = a(i)
                a(i) = a(j)
                a(j) = t
            End If
        Next j
    Next i
End Sub
Изменено: Hugo - 28.07.2016 13:56:05
 
Hugo, алгоритм каждой строчки кода я понимаю и он рабочий, по мне вроде всё прозрачно без усложнений, да и я правильно по вашей подсказке нашёл ошибку, хоть потом только разобрался))

другой вопрос товарищи, как игнорировать пустые значения? а то макрос сортирует их в самое начало, что по сути правильно, но совсем не нужно. Или это уже отдельная тема для разговора?
 
Цитата
Сливочный написал:
игнорировать пустые значения?
то есть поместить в конец?
Скрытый текст
F1 творит чудеса
Страницы: 1
Наверх