В общем, здравствуйте. Возникла проблема с сортировкой матрицы. Хотел написать на VBA, сортирует частично, но почему-то добавляет лишний столбец и там числа по рандому.
Может, где-то что неправильно написал в коде, т к занялся этим сегодня только. В общем, помогите, пожалуйста.
Код
Sub Сортировка_матрицы()
' Сортировка_матрицы Макрос
For i = 13 To 17
For j = 1 To 10
For k = 13 To 17
For l = 1 To 10
If l = 10 And k = 17 Then
' Ничего не делаем
Else
If l = 10 And Cells(k, l).Value > Cells(k + 1, 1).Value Then
Temp = Cells(k, l).Value
Cells(k, l).Value = Cells(k + 1, 1).Value
Cells(k + 1, 1).Value = Temp
Else
If Cells(k, l).Value > Cells(k, l + 1).Value Then
Temp = Cells(k, l).Value
Cells(k, l).Value = Cells(k, l + 1).Value
Cells(k, l + 1).Value = Temp
End If
End If
End If
Next l
Next k
Next j
Next i
End Sub
В общем, посмотрите, пожилуйста, и поправьте, если не сложно. И если есть встроенный способ, то хотелось бы знать, а то есть только сортировка обыкновенного массива. Алгоритм простой, как два пальца. Вот только что в коде не так, не пойму, ну или я в синтаксисе что-то недопонял. Может, лишнее условие выполняется.
Deuce97 написал: Может, где-то что неправильно написал в коде
Конечно, неправильно, 4-х уровневый for и в нем 3 уровня IF. Какая задача была у Вас?
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
по грамотно написанному коду не всегда просто понять суть задачи а по "криво написанному", который не решает ничего, понять что он должен решать - вообще НЕ ВОЗМОЖНО
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Ігор Гончаренко, тему я пояснил, да и в самом начале описано ПРОБЛЕМА С СОРТИРОВКОЙ МАТРИЦЫ. Если лень читать, то извините - не мои проблемы. К чему ваш этот ответ, не понимаю.
Честно говоря, я не пойду что тут правильного. Если вам нужна сортировка по возрастанию и/или убыванию, то я могу привести с десяток разных вариантов. Меня смущают какие-то условия, наподобие:
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
Алгоритм такой - сортировать строки, а последний элемент каждой строки сравнивать с первым элементом следующей строки и свапать, если нужно. Первое пустое условие нужно для того, чтобы игнорировать последний элемент. Как сделать возвращение к началу цикла по типу continue, не знаю.
Судя по коду Вы хотели реализовать сортировку перестановкой?
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
для того чтобы сортировать матрицу эту матрицу нужно получить в качестве аргумента или собрать из данных? если матрица двумерная, то нужно знать: по чему сортируем (колонки по какой-то строке или строки по какой-то колонке) по какой-то - это по какой конкретно? когда сортируем нужно знать сортируем по возростанию или убыванию?
Вы серьезно считаете, что фраза
Цитата
самом начале описано ПРОБЛЕМА С СОРТИРОВКОЙ МАТРИЦЫ.
отвечает на все печечисленные вопросы?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Ігор Гончаренко написал: по чему сортируем (колонки по какой-то строке или строки по какой-то колонке)по какой-то - это по какой конкретно?
Сортируем целиком, не отдельно строки или стоблцы, а ЦЕЛИКОМ. Первая ячейка - левый верхний угол - самый маленький элемент, последняя ячейка - правый нижний угол - самый большой элемент.
Пример моей боевой сортировки (сортировка расчёской), она намного быстрее пузырьковой, а вот о чём Вам говорит Ігор Гончаренко: Есть массив есть сортируемое поле arr_X(i, 1), которое сортируется по возрастанию:
Код
maxs = k - 1
gap = k - 1
Do While gap >= 1
If gap >= 1 Then
i = 1
Do While (i - 1 + gap) < maxs
If arr_X(i, 1) > arr_X(i + gap, 1) Then
For j = 1 To 5
buf = arr_X(i, j)
arr_X(i, j) = arr_X(i + gap, j)
arr_X(i + gap, j) = buf
Next
End If
i = i + 1
Loop
If (i + gap) >= maxs Then
If gap = 1 Then
gap = 0
End If
If gap = 2 Then
gap = 1
End If
gap = CLng(gap / 1.24733095010398)
End If
Loop
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
Ігор Гончаренко написал: эту матрицу нужно получить в качестве аргумента или собрать из данных?
без понятия, что вы сказали. Я обращаюсь к диапазону по ячейкам, диапазон у меня лично A13:J17 и его постепенно улучшаю, отсортировывая методом пузырька
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
допустим имеем матрицу 3х3, содержащую в произвольном порядке числа от 1 до 9 матрицы: 1 2 3 4 5 6 7 8 9 и 1 4 7 2 5 8 3 6 9 соответсвуют Вашему ТЗ? а какой вариант на самом деле нужен Вам? понимаете, о чем я несколько постов?
тема уже не в кайф, начинает утомлять удачи Вам в сортировке матриц и постановке задач!
Вставлю свои пять копеек: 1. Сортировать значения ячеек прямо на листе это гиблое дело. Как только их станет более - менее приличное количество - время станет совершенно неприемлемым. ИМХО нужно диапазон загнать в двумерный массив, его отсортировать, а потом результат вогнать обратно в диапазон. 2. Если Вы хотите получить в результате матрицу вида 1 2 3 4 5 6 7 8 9 , то я бы из двумерного массива сделал одномерный (столбцы вниз добавил), отсортировал его каким-нить чужим алгоритмом, а потом заполнил бы обратно двумерный массив значениями из одномерного. ИМХО, должно быть проще, чем сортировать двумерный массив.
Никогда не занимался сортировкой, так что решил попробовать.
Код
Sub Сортировка_матрицы()
Dim i As Long
Dim j As Long
Dim u As Long
Dim curCell As Range
Dim prevCell As Range
Dim tmp As Variant
Set curCell = Cells(13, 1)
For u = 1 To 50
For i = 13 To 17
For j = 1 To 10
Set prevCell = curCell
Set curCell = Cells(i, j)
If i = 13 And j = 1 Then GoTo nextI
If prevCell > curCell Then
tmp = prevCell
prevCell = curCell
curCell = tmp
End If
nextI:
Next j
Next i
Next u
End Sub
Deuce97, если я правильно понял по всей этой переписке: - берете данные с листа в массив - создаем доп.массив ,либо расширяем текущий - проходите циклом по массиву сверху вниз определяя наименьшее или что вам нужно определить - в доп.столбец массива (или вспомогательный массив, смотря какой вариант будет выбран) заносим результат вычисления по пред.пункту - далее сортируем массив по этому доп.столбцу по возрастанию любым алгоритмом - выгружаем данные обратно на лист за минусом доп.столбца
Anchoret, без обид, но я на Си это сделал за 1,5 минуты. Мне нужно было тупо большое кол-во данных отсортировать и я полдня потратил на это vba, в итоге отсортировал на Си, перезаписал в файл и готово.
Word мне говорит что в процедуре 421 символ, делим на 1.5 мин получаем скорость набора = 4.7 символа в сек.! я преклоняюсь перед талантом! и тут еще нет обращения к Excel, к диапазону A13:J17 и обратной выгрузки в диапазон УЖЕ СОРТИРОВАННОГО массива тоже не видно... но для профессионала - это мелочь! вот она победа СИ над VBA