Войти

Показать полную графическую версию : VBA - Упорядочить матрицу по убыванию модулей элементов


x3 aka a-droo
11-12-2011, 23:36
Столкнулся с проблемой

вобщем нужно отсортировать двумерный массив по убыванию модулей элементов

пока смог сделать только такую сортировку при которой элементы массива заменяются их модулями, а как я понимаю из условия задачи "Упорядочить матрицу по убыванию модулей элементов" нужно оставить все значения как и были , но при этом упорядочить по значениям их модулей.

делал по аналогии с вот этим

Dim indM, k, i, arr() As Single
n = 5
ReDim arr(1 To n)
arr(1) = 4
arr(2) = -3
arr(3) = 0
arr(4) = 3
arr(5) = -10
Dim Min As Single
For i = 1 To n - 1
Min = arr(i)
k_min = i
For j = i + 1 To n
If arr(j) < Min Then
Min = arr(j)
k_min = j
End If
Next
arr(k_min) = arr(i)
arr(i) = Min
Next


ну и пример на матрицах , как я понял условие

ВВОДИМ
3 -4 5
2 6 -9
7 -8 -1

ПОЛУЧАЕМ
-9 -8 7
6 5 -4
3 2 -1


а вот ,что получается в моей проге

9 8 7
6 5 4
3 2 1

у элементов с отрицательным значением теряются минусы,а их нужно оставить.

Sub Sort()

ReDim B(1 To m * n)

For i = 1 To m 'преобразуем в одномерный
For j = 1 To n
B(j + (i - 1) * n) = A(i, j)
Next j
Next i

For i = 1 To m * n - 1 'сортирую
Min = Abs(B(i))
k_min = i
For j = i + 1 To m * n
If Abs(B(j)) > Min Then
Min = Abs(B(j))
k_min = j
End If
Next
B(k_min) = Abs(B(i))
B(i) = Min
Next

For i = 1 To m 'преобразуем в двумерный
For j = 1 To n
A(i, j) = B(j + (i - 1) * n)
Next j
Next i



ListBox3.ColumnCount = n 'вывод
ListBox3.List = A
End Sub

lxa85
12-12-2011, 00:29
For i = 1 To m * n - 1 'сортирую
Min = Abs(B(i))
k_min = i
...
Next
B(k_min) = Abs(B(i))
B(i) = Min
Next »
Я сейчас точно не могу сформулировать. Но в этих присвоениях - ошибка. Внимательно смотри чему у тебя приравнивается абсолютная величина. Т.е. начало правильное - мы работаем с абсолютными величинами, а конец B(i) = Min - неправильный, т.к. Min - уже сам по себе модульный. Min = Abs(B(j)) »
А! Ну вот он зверь. К минимуму следует приравнять не модуль, а подмодульную величину.
Тогда код изменится примерно так (проверь):
For i = 1 To m * n - 1 'сортирую
Min = B(i)
k_min = i
For j = i + 1 To m * n
If Abs(B(j)) > Abs(Min) Then
Min = B(j)
k_min = j
End If
Next
B(k_min) = Abs(B(i))
B(i) = Min
Next
Что делает k_min я не понял, и честно сказать саму сортировку пока тоже не понял. На метод пузырька вроде похож, а вроде и нет. ... Ну и ладно, фиг с ним, главное, чтобы работал.

x3 aka a-droo
12-12-2011, 01:16
поставил ваш вариант
ситуация стала лучше, но не полностью исправилась)
иногда терял минусы , иногда нет))
вот скрин
http://forum.oszone.net/attachment.php?attachmentid=73910&d=1323638011

но потом методом тыка решил убрать модуль вот в этой строке

B(k_min) = B(i)

в результате вот рабочий кусок

For i = 1 To m * n - 1
Min = B(i)
k_min = i
For j = i + 1 To m * n
If Abs(B(j)) > Abs(Min) Then
Min = B(j)
k_min = j
End If
Next
B(k_min) = B(i)
B(i) = Min
Next




Огромное спасибо!)




© OSzone.net 2001-2012