Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/47: Рейтинг темы: голосов - 47, средняя оценка - 4.85
72 / 64 / 3
Регистрация: 13.05.2010
Сообщений: 349

Сортировка двумерного массива

05.12.2011, 10:47. Показов 10056. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
искала-искала, про двумерные массивы не нашла
может есть какой-то стандартный метод (типа sort) чтобы отсортировать двумерный массив, а ещё желательно сразу по двум столбцам???
очень надо, подскажите пожалуйста, кто знает!!!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.12.2011, 10:47
Ответы с готовыми решениями:

Сортировка двумерного массива
"Дан двумерный массив. Нужно найти четные элементы массива (по i , j и значению) ниже главной диагонали четвертой строки и нечетные...

Сортировка двумерного массива, срочно
Дан массив 6*6 нужно получить результирующий массив, где каждая строка упорядочена по возврастанию.... и также упорядочить эту задачу по...

Сортировка элементов столбцов двумерного массива
А. Составить процедуру сортировки по убыванию значений элементов массива А(М) (М - заданное число). В. Используя процедуру рассортировать...

16
Эксперт Hardware
 Аватар для Linoge
3205 / 1915 / 324
Регистрация: 25.10.2011
Сообщений: 5,564
05.12.2011, 11:38
Сортировка каждого столбца по возрастанию - это по сути несколько сортировок одномерного массива.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Dim mas(3, 6) As Integer
Private Sub Command1_Click()
Label1 = ""
Label2 = ""
'заполнение массива случайными числами
For i = 0 To 2
    For j = 0 To 5
        mas(i, j) = 20 * Rnd(1)
        Label1 = Label1 & " " & mas(i, j)
    Next
    Label1 = Label1 & "  "
Next
'сортировка внутри каждого столбца
For i = 0 To 2
    'Max = 0
    For j = 1 To 5
        k = j
        Do While k > 0
            If mas(i, k) < mas(i, k - 1) Then
                t = mas(i, k)
                mas(i, k) = mas(i, k - 1)
                mas(i, k - 1) = t
                k = k - 1
            Else
                Exit Do
            End If
        Loop
    Next
Next
'Вывод
For i = 0 To 2
    For j = 0 To 5
        Label2 = Label2 & " " & mas(i, j)
    Next
    Label2 = Label2 & "  "
Next
End Sub
Или и сами столбцы тоже нужно сортировать? Тогда по какому признаку.
0
72 / 64 / 3
Регистрация: 13.05.2010
Сообщений: 349
05.12.2011, 11:51  [ТС]
извините, забыла уточнить, что необходимо отсортировать значения (в столбце) типа string в соответствии с заранее заданным списком.
0
Эксперт Hardware
 Аватар для Linoge
3205 / 1915 / 324
Регистрация: 25.10.2011
Сообщений: 5,564
05.12.2011, 12:04
Можно более подробно описать: что дано и что нужно сделать.
А лучше пример как должно выглядеть.
0
72 / 64 / 3
Регистрация: 13.05.2010
Сообщений: 349
05.12.2011, 12:43  [ТС]
есть массив с данными - как обычная табличка
8 столбцов.
каждой строчке соответствует отдельный объект с восьмью параметрами.
нужно упорядочить по столбцу "код" (string)
а если код повторяется несколько раз, то среди этих строк (с одинаковым кодом) упорядочить ещё по одному параметру "содержание" (тоже string)
0
Эксперт Hardware
 Аватар для Linoge
3205 / 1915 / 324
Регистрация: 25.10.2011
Сообщений: 5,564
05.12.2011, 13:41
А почему бы так сразу не написать?
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Dim mas(10, 8) As String
Private Sub Command1_Click()
Label1 = ""
Label2 = ""
'перенос слов в label чтоб корректно отображалась инфа
Label1.WordWrap = True
Label1.WordWrap = True
'заполнение массива случайными именами
For i = 0 To 9
    For j = 0 To 7
        mas(i, j) = "name" & Int(20 * Rnd(1))
        Label1 = Label1 & " " & mas(i, j)
    Next
    Label1 = Label1 & vbCrLf
Next
'сортировка по столбцу 0
For i = 1 To 9
    k = i
    Do While k > 0
        If mas(k, 0) < mas(k - 1, 0) Then
            For j = 0 To 7
                t = mas(k, j)
                mas(k, j) = mas(k - 1, j)
                mas(k - 1, j) = t
            Next
            k = k - 1
        Else
            Exit Do
        End If
        
    Loop
Next
'сортировка по столбцу 1 при условии равенства значений в столбце 0
For i = 1 To 10
    k = i
    Do While k > 0
        If mas(k, 0) = mas(k - 1, 0) Then
        
            If mas(k, 1) < mas(k - 1, 1) Then
                For j = 0 To 7
                    t = mas(k, j)
                    mas(k, j) = mas(k - 1, j)
                    mas(k - 1, j) = t
                Next
                k = k - 1
            Else
                Exit Do
            End If
            
            k = k - 1
        Else
            Exit Do
        End If
    Loop
Next
'Вывод
For i = 0 To 9
    For j = 0 To 7
        Label2 = Label2 & " " & mas(i, j)
    Next
    Label2 = Label2 & vbCrLf
Next
End Sub
2
 Аватар для Апострофф
9908 / 3919 / 742
Регистрация: 11.10.2011
Сообщений: 5,902
05.12.2011, 14:37
Если 20-ю строчку записать так, то
Visual Basic
1
If mas(k, 0) < mas(k - 1, 0)or mas(k, 0) = mas(k - 1, 0)and mas(k, 1) < mas(k - 1, 1) Then
то блок
Visual Basic
1
2
3
'сортировка по столбцу 1 при условии равенства значений в столбце 0
for i...
next
можно убрать!

Цитата Сообщение от vstz Посмотреть сообщение
Dim mas(10, 8) As String
И зачем избыточность, если 10-я строка и 8-й столбец не задействованы?
1
72 / 64 / 3
Регистрация: 13.05.2010
Сообщений: 349
05.12.2011, 14:41  [ТС]
оператор ">" в 20-ой строчке сравнивает числовые значения, а мне надо типа string
(вот и ругается - "type mismatch")
0
6644 / 1511 / 169
Регистрация: 09.01.2010
Сообщений: 4,298
05.12.2011, 15:09
сортировка по всех столбиках
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Private Sub Command1_Click()
Dim n, m, a()
n = 8: m = 8
ReDim a(n, m)
Text1.Text = "": Text2.Text = ""
For i = 1 To n
  For j = 1 To m
    a(i, j) = Chr(Int(Rnd * 4) + 224)
    Text1.Text = Text1.Text & a(i, j) & vbTab
  Next
    Text1.Text = Text1.Text & vbCrLf
Next
 
sort1 a(), LBound(a, 2) '1
 
For i = 1 To n
  For j = 1 To m
    Text2.Text = Text2.Text & a(i, j) & vbTab
  Next
    Text2.Text = Text2.Text & vbCrLf
Next
End Sub
 
Sub sort1(a(), p)
Dim tr As Boolean
Dim n%, m%, l1%, l2%, k%, u%
n = UBound(a, 1): m = UBound(a, 2)
l1 = LBound(a, 1): l2 = LBound(a, 2)
If p = m Then
   Exit Sub
Else
    For i = l1 To n - 1
       For j = i + 1 To m
        If p = 1 Then GoTo 1
         tr = True
         For u = l2 To p - 1
            If a(i, u) <> a(j, u) Then
              tr = False
              Exit For
            End If
         Next u
         If tr Then
1          If a(i, p) > a(j, p) Then
            For k = l2 To m
              t = a(i, k): a(i, k) = a(j, k): a(j, k) = t
            Next k
          End If
         End If
      Next
   Next
p = p + 1
sort1 a(), p
End If
 
End Sub
0
Эксперт Hardware
 Аватар для Linoge
3205 / 1915 / 324
Регистрация: 25.10.2011
Сообщений: 5,564
05.12.2011, 15:12
Цитата Сообщение от Апострофф Посмотреть сообщение
И зачем избыточность, если 10-я строка и 8-й столбец не задействованы?
"Просто так" (c)


оператор ">" в сравнивает числовые значения, а в случае строк и символов их ascii коды.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Option Compare Text
Dim mas(9, 7) As String
Private Sub Command1_Click()
Label1 = ""
Label2 = ""
'перенос слов в label чтоб корректно отображалась инфа
Label1.WordWrap = True
Label1.WordWrap = True
'заполнение массива случайными именами
For i = 0 To 9
    For j = 0 To 7
        mas(i, j) = Chr(Int(25 * Rnd(1)) + 65) & Chr(Int(25 * Rnd(1)) + 65) & Chr(Int(25 * Rnd(1)) + 65)
        Label1 = Label1 & " " & mas(i, j)
    Next
    Label1 = Label1 & vbCrLf
Next
 
'сортировка по 0 и 1 столбцу 
For i = 1 To 9
    k = i
    Do While k > 0
        If mas(k, 0) < mas(k - 1, 0) Or mas(k, 0) = mas(k - 1, 0) And mas(k, 1) < mas(k - 1, 1) Then
            For j = 0 To 7
                t = mas(k, j)
                mas(k, j) = mas(k - 1, j)
                mas(k - 1, j) = t
            Next
            k = k - 1
        Else
            Exit Do
        End If
        
    Loop
Next
'Вывод
For i = 0 To 9
    For j = 0 To 7
        Label2 = Label2 & " " & mas(i, j)
    Next
    Label2 = Label2 & vbCrLf
Next
End Sub
все работает
0
72 / 64 / 3
Регистрация: 13.05.2010
Сообщений: 349
16.01.2012, 14:20  [ТС]
сделала вручную...
надеюсь не зря сама писала
просто сначала отсортировала по одному параметру, потом выбрала строки с одинаковым этим параметром (столько раз сколько получилось групп с одинаковым первым параметром) и отсортировала их в соответствии с определенным списком и всё это перезаписала в другой массив...
0
0 / 0 / 0
Регистрация: 11.06.2015
Сообщений: 6
28.06.2015, 15:11
Возникла похожая задача. Только не по двум столбцам, а по 28.
Думаю, что её можно свести к одномерной сортировке, правда придётся заплатить памятью.
Идея такая - все столбцы склеиваются через разделитель в одну строку в последовательности приоритета сортировки. Потом выполняется обычная сортировка любым одномерным алгоритмом. Дальше записи расщепляются обратно на столбцы стандартным Split
0
6644 / 1511 / 169
Регистрация: 09.01.2010
Сообщений: 4,298
28.06.2015, 15:18
а 28 столбцов какого типа
0
0 / 0 / 0
Регистрация: 11.06.2015
Сообщений: 6
28.06.2015, 15:53
Цитата Сообщение от gaw Посмотреть сообщение
а 28 столбцов какого типа
В целом текстового, хотя в частности могут попадаться и числа, но они всё равно хранятся в текстовом виде.

Добавлено через 32 минуты
Вот как-то так получается:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 Sub SortMultArr(ByRef mas(,) As String)
        Dim d() As String = Nothing
        Dim tmp() As String
        Dim L As ULong, M As ULong
        Dim i As ULong, j As ULong
 
        M = UBound(mas, 2)
        L = UBound(mas, 1)
        ReDim d(M)
        For j = 0 To M 'Склеиваем строки в промежуточный массив
            d(j) = mas(0, j)
            For i = 1 To L
                d(j) = d(j) & tmpDelimiter & mas(i, j)
            Next i
        Next j
        System.Array.Sort(d)
 
        For i = 0 To M 'Расщепляем строки обратно на записи
            tmp = Split(d(i), tmpDelimiter)
            If UBound(tmp) <> L Then 'немножко перестраховки на случай случайной встречи разделителя в тексте
                MsgBox("Ошибка сортировки. Несовпадение границ", vbCritical)
                Exit Sub
            End If
            For j = 0 To L
                mas(j, i) = tmp(j)
            Next
        Next i
    End Sub
tmpDelimiter - символ(ы) разделителя
0
Модератор
Эксперт функциональных языков программирования
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
29.06.2015, 23:43
Цитата Сообщение от AMVAS Посмотреть сообщение
Возникла похожая задача. Только не по двум столбцам, а по 28.
Думаю, что её можно свести к одномерной сортировке, правда придётся заплатить памятью.
Идея такая - все столбцы склеиваются через разделитель в одну строку в последовательности приоритета сортировки. Потом выполняется обычная сортировка любым одномерным алгоритмом. Дальше записи расщепляются обратно на столбцы стандартным Split
Не надо ничего склеивать. Нужно задать свою функцию сравнения для строк массива ("компарер"), которая будет сравнивать столбцы в последовательности приоритета сортировки, и использовать её в алгоритме сортировки вместо операторов сравнения.
0
0 / 0 / 0
Регистрация: 11.06.2015
Сообщений: 6
29.06.2015, 23:52
Цитата Сообщение от Shamil1 Посмотреть сообщение
Не надо ничего склеивать. Нужно задать свою функцию сравнения для строк массива ("компарер"), которая будет сравнивать столбцы в последовательности приоритета сортировки, и использовать её в алгоритме сортировки вместо операторов сравнения.
Да, в принципе можно и так. В цикле организовать поэтапное сравнение элементов в порядке, заданном индексами в специальном массиве. Тогда память не потребуется лишнюю тратить...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.06.2015, 23:52
Помогаю со студенческими работами здесь

Сортировка двумерного массива по чётности позиций
Здравствуйте! Прошу помощи. Не знаю алгоритма перестановок столбцов по чётности. Как переставлять, не вручную же, если столбцов несколько...

Сортировка двумерного массива
Результаты поиска не удовлетворили Суть программы: Пользователь задаёт размерность квадратной матрицы Каждому элементу матрицы...

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

Сортировка двумерного массива
Помогите пожалуйста... Есть матрица, 9х9 которая заполняется случайными числами. Нужно заменить нулями все элементы в обведенных областях...

Сортировка двумерного массива
program p1; type t=array of char; tt=array of t; var a:tt; i,j,n:byte; begin assign(input,'dan1.inp'); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru