Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   VBA - Упорядочить матрицу по убыванию модулей элементов (http://forum.oszone.net/showthread.php?t=222682)

x3 aka a-droo 11-12-2011 23:36 1813528

VBA - Упорядочить матрицу по убыванию модулей элементов
 
Вложений: 1
Столкнулся с проблемой

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

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

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

Код:

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 1813549

Цитата:

Цитата 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 »

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

Цитата x3 aka a-droo
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 1813560

Вложений: 1
поставил ваш вариант
ситуация стала лучше, но не полностью исправилась)
иногда терял минусы , иногда нет))
вот скрин
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



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


Время: 19:49.

Время: 19:49.
© OSzone.net 2001-