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

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

05.12.2011, 10:47. Показов 10098. Ответов 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 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
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
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru