Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/54: Рейтинг темы: голосов - 54, средняя оценка - 4.81
0 / 0 / 2
Регистрация: 11.05.2015
Сообщений: 35

Сортировка матрицы по k-ому столбцу

14.03.2016, 15:23. Показов 10426. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. В лабораторной работе нужно ввести с консоли n - размерность матрицы a[n] [n]. Задать значения элементов матрицы в интервале значений от n1 до n2 с помощью датчика случайных чисел и упорядочить матрицу в порядке убывания k-го столбца.
Со вводом матрицы и заполнением практически понятно все, а с сортировкой не выходит. В задании нужно ввести номер столбца, по которому будем сортировать, его отсортировать в порядке убывания и вместе с ним остальные строки.
Пишем на идее, пятнадцатая версия. Нужно все максимально упрощенно, для уровня начинающего.
Огромное спасибо заранее ответившему.
Знаю примерно как сортировать в С++, в джаву это всунуть не получается(

P.S. например если была матрица
1 2 3 4
5 6 7 8
6 5 1 10
2 1 5 8
Если например выбираем второй столбец, должно выйти
5 6 7 8
6 5 1 10
1 2 3 4
2 1 5 8
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.03.2016, 15:23
Ответы с готовыми решениями:

Что не так подскажите, нужно отсортировать массив 5х5 по 1-ому и 5-ому столбцу по убыванию их значений
#include <stdio.h> int main(void) { int mass, tmp; printf("Двумерный целочисленный массив размерностью 5х5: \n"); for...

Оставить только слова, относящиеся к к-ому столбцу
Помогите со скриптом. Реализовать аналог утилиты cut, которая во входящем со стандартного ввода потоке строк оставляет только слова,...

Связанная сортировка матрицы по столбцу
Здравствуйте, вы бы не могли мне помочь, у меня есть матрица 120 строк и 6 столбцов (или двухмерный массив), не подскажете как мне...

15
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
14.03.2016, 15:42
Цитата Сообщение от Sandor19 Посмотреть сообщение
Нужно все максимально упрощенно, для уровня начинающего.
не совсем тот уровень, но не все же пузырьком делать. Что непонятно - спрашивайте.
Java
1
2
3
4
5
6
7
8
9
int n = 1;
        int a[][] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 6, 5, 1, 10 }, { 2, 1, 5, 8 } };
        Arrays.sort(a, (x, y) -> y[n]-x[n]);
        for (int i[] : a)
        {
            for (int j : i)
                System.out.print(String.format("%3d", j));
            System.out.println();
        }
3
0 / 0 / 2
Регистрация: 11.05.2015
Сообщений: 35
16.03.2016, 12:21  [ТС]
Такого не проходили и нужно именно проще. Получилось как-то вот так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
System.out.println("Выберите столбец: ");
String E= br.readLine();
int e=Integer.valueOf(E).intValue();
 
System.out.println("Итог:");
 
for (int i=0; i<m; i++)
for (int k=i+1; k < m; k++) {
if (A[i][e] > A[k][e]){
for (int j=0; j < m; j++) {
int temp = A[i][j];
A[i][j]=A[i][e];
A[i][e]=temp;
}
}
}
И в самой сортировке где-то ошибка, которую я не могу никак исправить.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
16.03.2016, 13:22
Цитата Сообщение от Sandor19 Посмотреть сообщение
И в самой сортировке где-то ошибка, которую я не могу никак исправить.
е никак не влияет на свап строк, только в условии
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
for (int i = 0; i < m; i++)
            for (int k = i + 1; k < m; k++)
            {
                if (A[i][e] < A[k][e])
                {
                    for (int j = 0; j < m; j++)
                    {
                        int temp = A[i][j]; //e никак не влияет на выбор ячейки
                        A[i][j] = A[k][j];
                        A[k][j] = temp;
                    }
                }
            }
Цитата Сообщение от Sandor19 Посмотреть сообщение
Такого не проходили
это не повод не изучить что-то новое)
0
0 / 0 / 2
Регистрация: 11.05.2015
Сообщений: 35
16.03.2016, 21:48  [ТС]
Все равно не сортирует как нужно, выходит что-то вот такое, если выбирать 2 столбец.
24 49 98
35 53 99
65 102 14

65 102 14
24 49 98
35 53 99
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
16.03.2016, 22:06
Sandor19, выкладывайте весь код, от начала до конца.
Кликните здесь для просмотра всего текста
Java
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
int A[][] = { { 24, 49, 98}, { 35, 53, 99}, { 65, 102, 14}};
        int m = 3;
        int e = 1;
        for (int i[] : A)
        {
            for (int j : i)
                System.out.print(String.format("%4d", j));
            System.out.println();
        }
        System.out.println();
        for (int i = 0; i < m; i++)
            for (int k = i + 1; k < m; k++)
            {
                if (A[i][e] < A[k][e])
                {
                    for (int j = 0; j < m; j++)
                    {
                        int temp = A[i][j]; //e никак не влияет на выбор ячейки
                        A[i][j] = A[k][j];
                        A[k][j] = temp;
                    }
                }
            }
        for (int i[] : A)
        {
            for (int j : i)
                System.out.print(String.format("%4d", j));
            System.out.println();
        }

вывод
Java
1
2
3
4
5
6
7
  24  49  98
  35  53  99
  65 102  14
 
  65 102  14
  35  53  99
  24  49  98
1
0 / 0 / 2
Регистрация: 11.05.2015
Сообщений: 35
16.03.2016, 22:11  [ТС]
От нас требуют вот такого вот громадного и неудобного кода, так понятно, что все можно куда проще(

Java
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
64
65
66
67
68
69
70
71
72
73
74
75
76
public class Main {
 
    public static void main(String[] args) {
 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try {
            System.out.println("Введите размерность матрицы: ");
            String  n= br.readLine();
            int m=Integer.valueOf(n).intValue();
            System.out.println("Введите границы рандома: ");
            String  Q= br.readLine();
            int q=Integer.valueOf(Q).intValue();
            String  W= br.readLine();
            int w=Integer.valueOf(W).intValue();
 
            System.out.println("Ваша матрица: ");
            
            int[][] A = new int[m][m];
            for (int i=0; i<m; i++)
            {
                for (int j=0; j<m; j++)
                {
                    A[i][j] = q+ (int) (Math.random()*((w-q)+1));
                }
            }
            
            for (int i=0; i<m; i++)
            {
                for (int j=0; j<m; j++)
                {
                    System.out.print( A[i][j]+" ");
                }
                System.out.print("\n");
            }
 
 
            System.out.println("Выбирайте столбец: ");
            String  E= br.readLine();
            int e=Integer.valueOf(E).intValue();
 
 
            System.out.println("Итог:");
 
            
            for (int i=0;  i<m; i++)
                for (int k=i+1; k < m; k++) {
                    if (A[i][e] > A[k][e]){
                        for (int j=0; j < m; j++) {
                            int temp = A[i][j];
                            A[i][j]=A[i][e];
                            A[i][e]=temp;
                        }
                    }
                }
 
 
 
            for (int i=0; i<m; i++)
            {
                for (int j=0; j<m; j++)
                {
                    System.out.print(A[i][j]+" ");
                }
                System.out.print("\n");
            }
        } catch (IOException r) {
            System.out.println("ошибка ввода " + r);
        }
        catch (NumberFormatException r) {
            System.out.println("ошибка невозможного преобразования строки в числовой формат " + r);
        }
 
 
 
    }
}
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
16.03.2016, 22:20
Sandor19, ну так сравните мой цикл сортировки и ваш, я даже комментарий оставил внутри...
Цитата Сообщение от Sandor19 Посмотреть сообщение
так понятно, что все можно куда проще(
а вы выкладывайте со всеми своими вводами и выводами. А так приходится самому задавать переменные своим способом.
0
0 / 0 / 2
Регистрация: 11.05.2015
Сообщений: 35
16.03.2016, 22:26  [ТС]
Исправляла, был тот же результат. Теперь запустила - заработало, но выдает ошибку, если выбираю третий столбец.

Добавлено через 2 минуты
Брала 3 на 3 матрицу. Взяла 4 на 4 - перестал сортировать совсем, по тому же третьему столбцу.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
16.03.2016, 22:29
Sandor19, опять та же ошибка, выкладывайте код(если он изменяется относительно последней версии) и содержимое консоли, которое вам не нравится. Наверняка 3й столбец обозначаете цифрой 3, а не 2, т.к. индексы с нуля считаются.
Цитата Сообщение от Sandor19 Посмотреть сообщение
Исправляла, был тот же результат. Теперь запустила - заработало
машина ошибается реже, чем человек)
1
0 / 0 / 2
Регистрация: 11.05.2015
Сообщений: 35
16.03.2016, 22:38  [ТС]
Вот исправленный:
Java
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
64
65
66
67
68
69
70
71
72
73
74
75
public class Main {
 
    public static void main(String[] args) {
 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try {
            System.out.println("Введите размерность матрицы: ");
            String  n= br.readLine();
            int m=Integer.valueOf(n).intValue();
            System.out.println("Введите границы рандома: ");
            String  Q= br.readLine();
            int q=Integer.valueOf(Q).intValue();
            String  W= br.readLine();
            int w=Integer.valueOf(W).intValue();
 
            System.out.println("Ваша матрица: ");
            //�������
            int[][] A = new int[m][m];
            for (int i=0; i<m; i++)
            {
                for (int j=0; j<m; j++)
                {
                    A[i][j] = q+ (int) (Math.random()*((w-q)+1));
                }
            }
            // �����
            for (int i=0; i<m; i++)
            {
                for (int j=0; j<m; j++)
                {
                    System.out.print( A[i][j]+" ");
                }
                System.out.print("\n");
            }
 
 
            System.out.println("Выбирайте столбец: ");
            String  E= br.readLine();
            int e=Integer.valueOf(E).intValue();
 
 
            System.out.println("Итог:");
 
            for (int i=0;  i<m; i++)
                for (int k=i+1; k < m; k++) {
                    if (A[i][e] > A[k][e]){
                        for (int j=0; j < m; j++) {
                            int temp = A[i][j];
                            A[i][j]=A[k][j];
                            A[k][j]=temp;
                        }
                    }
                }
 
 
 
            for (int i=0; i<m; i++)
            {
                for (int j=0; j<m; j++)
                {
                    System.out.print(A[i][j]+" ");
                }
                System.out.print("\n");
            }
        } catch (IOException r) {
            System.out.println("ошибка ввода " + r);
        }
        catch (NumberFormatException r) {
            System.out.println("ошибка невозможного преобразования строки в числовой формат " + r);
        }
 
 
 
    }
}

Ввожу матрицу 3 на 3 и пробую сортировать по 3 столбцу:
95 12 30
81 80 35
21 12 74
Выдает Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException : 3
С матрицей 4 на 4 выдает ошибку при выборе 4 столбца. При выборе третьего отсортировало неправильно:
74 52 43 45
41 56 79 50
27 46 29 76
61 107 19 90

Выбирайте столбец:
3
Итог:
74 52 43 45
41 56 79 50
27 46 29 76
61 107 19 90

Пробовала еще с матрицами 4 на 4, их не сортирует правильно совсем.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
16.03.2016, 22:48
Лучший ответ Сообщение было отмечено Sandor19 как решение

Решение

Sandor19, ВО! сразу бы такие данные, все было бы куда проще
1. строка 46 вашего кода if (A[i][e] > A[k][e]){
моего кода: if (A[i][e] < A[k][e])
(вам же по убыванию надо, верно?)
2.
Цитата Сообщение от Sandor19 Посмотреть сообщение
Ввожу матрицу 3 на 3 и пробую сортировать по 3 столбцу:
еще раз, матрица 3х3, это значит у нее есть столбцы 0, 1, 2. НЕТ столбца под номером 3. Так же в матрице 4х4 нет 4
Если хотите это пофиксить
Java
1
2
int e = Integer.valueOf(E).intValue();
e--; //добавляете эту строку и индекс будет соответствовать компьютерному представлению
1
0 / 0 / 2
Регистрация: 11.05.2015
Сообщений: 35
16.03.2016, 22:54  [ТС]
Заработало, аллилуйя!
Спасибо вам огромное.
Теперь все работает и все понятно)
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
16.03.2016, 22:59
Цитата Сообщение от Sandor19 Посмотреть сообщение
Заработало, аллилуйя!
Спасибо вам огромное.
Теперь все работает и все понятно)
всегда пожалуйста)
0
 Аватар для TomasMaple
0 / 0 / 0
Регистрация: 17.04.2020
Сообщений: 47
23.06.2021, 11:34
КОП, подскажите пожалуйста есть ли справочная информация по методу который Вы использовали? //не смогла найти
Java
1
 Arrays.sort(a, (x, y) -> y[n]-x[n]);
И возможно ли его использовать для сортировки матрицы по k-строке? Если да, то как нужно изменить аргументы метода?
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
24.06.2021, 15:36
Цитата Сообщение от TomasMaple Посмотреть сообщение
подскажите пожалуйста есть ли справочная информация по методу который Вы использовали? //не смогла найти
Документация класса Arrays

Цитата Сообщение от TomasMaple Посмотреть сообщение
И возможно ли его использовать для сортировки матрицы по k-строке?
Транспонируйте, сортируйте, транспонируйте обратно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.06.2021, 15:36
Помогаю со студенческими работами здесь

Сортировка матрицы по последнему столбцу
Нужно отсортировать матрицу по последнему столбцу. То есть в зависимости сортировки последнего столбца отсортировать всю матрицу. Я...

Сортировка матрицы по строке/столбцу
Как отсортировать матрицу по n строке? Нужно отсортировать матрицу, например по 2 столбцу. То есть упорядочить элементы 2 столбца, а...

Сортировка матрицы по заданному столбцу
Как сделать сортировку матрицы по заданному столбцу в javascript?

Сортировка матрицы по столбцу вместе со строкой
Отсортировать столбец вместе со строкой. Пример: Отсортировать по 5 столбцу Что было: 1 3 5 6 7 2 4 6 8 2 9 7 5 3 1 1 1 1...

Быстрая сортировка матрицы по первому столбцу
Мне нужно с помощью быстрой сортировке отсортировать матрицу. Матрица состоит из 0 и 1, кроме первого, первый столбец - это сумма элементов...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
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