VBA - VBA - Упорядочить матрицу по убыванию модулей элементов

Ответить
Аватара пользователя
x3 aka a-droo

VBA - VBA - Упорядочить матрицу по убыванию модулей элементов

Сообщение x3 aka a-droo »

Столкнулся с проблемой



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



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



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





Код:

Код: Выделить всё

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
Вложения
1cyberforum.zip
(18.03 КБ) 0 скачиваний
1cyberforum.zip
(18.03 КБ) 0 скачиваний
Аватара пользователя
lxa85

Re: VBA - VBA - Упорядочить матрицу по убыванию модулей элементов

Сообщение lxa85 »

Цитата x3 aka a-droo:



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
VBA - VBA - Упорядочить матрицу по убыванию модулей элементов




Я сейчас точно не могу сформулировать. Но в этих присвоениях - ошибка. Внимательно смотри чему у тебя приравнивается абсолютная величина. Т.е. начало правильное - мы работаем с абсолютными величинами, а конец B(i) = Min - неправильный, т.к. Min - уже сам по себе модульный.
Цитата x3 aka a-droo:



Min = Abs(B(j))
VBA - VBA - Упорядочить матрицу по убыванию модулей элементов




А! Ну вот он зверь. К минимуму следует приравнять не модуль, а подмодульную величину.

Тогда код изменится примерно так (проверь):



Код:

Код: Выделить всё

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

Re: VBA - VBA - Упорядочить матрицу по убыванию модулей элементов

Сообщение x3 aka a-droo »

поставил ваш вариант

ситуация стала лучше, но не полностью исправилась)

иногда терял минусы , иногда нет))

вот скрин

http://forum.oszone.net/attachment.p...0&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





Огромное спасибо!)
Вложения

[Расширение jpg было запрещено, вложение больше недоступно.]

Ответить

Вернуться в «Программирование и базы данных»