Есть подозрение, что метки могут заменить рекурсию, ускорив процесс, но не хватает "шестерёнок" в голове — прошу подсобить, создав функцию FILE_Array1xSortInd2 на метках (потуги прикрепил) по образу и подобию рекурсивной FILE_Array1xSortInd
Сортер взял отсюда, тестирую на 601 100 строк вот этих данных.
КОДЫ
Код
Public Function FILE_Array1xSortInd2(arrVal(), arrInd() As Long, l&, u&)
Dim x, y, i&, j&, ll&, uu&
ll = l: uu = u
repeat: i = ll: j = uu: x = arrVal((i + j) \ 2)
Do
Do While arrVal(i) < x: i = i + 1: Loop
Do While x < arrVal(j): j = j - 1: Loop
If i <= j Then
y = arrVal(i): arrVal(i) = arrVal(j): arrVal(j) = y
y = arrInd(i): arrInd(i) = arrInd(j): arrInd(j) = y
i = i + 1: j = j - 1
End If
Loop Until i > j
If ll < j Then uu = j: GoTo repeat
If i < uu Then ll = i: GoTo repeat
End Function
'-------------------------------------------------------------------------------------------
Public Function FILE_Array1xSortInd(arrVal(), arrInd() As Long, l&, u&)
Dim x, y, i&, j&
i = l: j = u: x = arrVal((l + u) \ 2)
Do
Do While arrVal(i) < x: i = i + 1: Loop
Do While x < arrVal(j): j = j - 1: Loop
If i <= j Then
y = arrVal(i): arrVal(i) = arrVal(j): arrVal(j) = y
y = arrInd(i): arrInd(i) = arrInd(j): arrInd(j) = y
i = i + 1: j = j - 1
End If
Loop Until i > j
If l < j Then Call FILE_Array1xSortInd(arrVal, arrInd, l, j)
If i < u Then Call FILE_Array1xSortInd(arrVal, arrInd, i, u)
End Function
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
фактически ни на чём разве что замечал, что метки очень шустрые и иногда их юзаю для перехода внутри вложенных циклов и это работает… Сможете подсобить?)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
За редкими исключениями, основное назначение меток и операторов перехода в любом языке программирования - резко ухудшить надежность и читабельность кода...
sokol92, знаю-знаю-знаю - очень много раз это слышал. Вопрос в 1ую очередь о самой возможности (как это будет выглядеть).
P.S.: сколько раз слышал про ужасы использования меток, но не видел на практике в коде (крайне неудачного применения) ни разу Часто видел, что их можно заменить, но никакого "криминала" - я использую частенько и всё ОК…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
sokol92 написал: основное назначение меток и операторов перехода в любом языке программирования
это возможность резко перейти (перескочить) на выполнение кода с указанной метки наличие меток в коде никак не ухудшает его надежности, ровно так же как их отсутствие не является гарантией надежности кода
пишите рекурсию на рекурсии - это упростит и задачу и понимание кода а использовать метки или нет - это исключительно дело вкуса. я не вспомню когда использовал метку в моем коде в последний раз, может 10 лет назад,может 15 или 20. я предпочитаю написать дополнительную процедуру и в нужных местах поставить Exit Sub чтобы не использовать переходы на метки возвращаясь к первой мысли - это не сделало написанное мною хоть сколько-нибудь надежнее))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Ігор Гончаренко, согласен по поводу меток. По ссылке в #5 я демонстрировал удобство (НЕ незаменимость, а именно удобство) их использования в некоторых случаях. По коду поможете? В смысле это вообще возможно?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
vikttur, я понимаю, что это как раз неправильное и совершенно ненужное использование меток. Просто не могу догнать, как это сделать… Чисто в рамках эксперимента)))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Может я ошибаюсь, но привык к образному мышлению. Рекурсия представляет собой самовложенный цикл с ограничением глубины вложенности. Т.е. с каждым переходом контекст операций становится все "глубже", при достижении ограничения конечный итог разворачивается в обратном направлении, "собирая результат" с каждого "уровня". Переход по меткам осуществляется на одном уровне вложенности, либо на уровень(уровни) выше. Чтобы того же эффекта, что и при рекурсии, необходим просчет переменных при определенных условиях, описание которых будет более заморочным и ресурсозатратным, чем использование рекурсии.
Tuvash написал: необходим просчет переменных при определенных условиях, описание которых будет более заморочным и ресурсозатратным, чем использование рекурсии.
Ну, на счёт ресурсоёмкости я бы так не сказал. В силу того, что Quick Sort естественно рекурсивный (то есть при каноническом виде с рекурсией компилятор за вас организовывает стек и организует код для сохранения состояния переменных и аргументов функции между вызовами) . Для не рекурсивного варината нужно всего лишь нужно организовать стек для хранения индексов текущего диапазона сортировки. На этом и получить выигрыш по памяти, так как в стек не будут помещаться не нужные там локальные переменные. Плюс некоторый выигрыш по быстродействию - исключается вызов метода на каждом этапе - это тоже имеет накладные расходы. Но писать в таком стиле - да, несколько сложнее. Хе, хе. Если бы Алексей не переименовал алгоритм и помнил бы откуда ноги растут, то давно бы нашёл не рекурсивную версию
vikttur написал: Если переходить по метке выше исполняемой строки - та же ресурсия,
- а вот тут уже я не согласен ибо рекурсия - процесса внутри самого этого объекта или процесса, то есть ситуация, когда объект является частью самого себя. Переход по метке - это уже просто цикл.
Да, не так выразился. Писал о похожести. При рекурсии процедура вызывает сама себя. При метке сверху получаем цикл, да. Но почему рекурсия - не цикл ( в общем понятии)?
vikttur написал: Но почему рекурсия - не цикл ( в общем понятии)?
ПО тому что вызова процедуры из самой себя не происходить. Тут скорее обратная связь в усилителе больше на рекурсию похожа. Но в целом - условности все это.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄