Java сортировка двумерного массива пузырьком

Отсортировать пузырьком строки двумерного массива в порядке возрастания суммы элементов строки

Матрица чисел N на M. Надо отсортировать строки матрицы в порядке возрастания суммы элементов строки, а строки с одинаковой суммой должны остаться в таком же порядке относительно друг друга как были до сортировки. Сортировку использовать пузырьком.
inp
4 3
3 2 0
1 4 2
5 7 1
1 1 1

out
1 1 1
3 2 0
1 4 2
5 7 1

С одномерным массивом проблем нет в сортировке, но с двумерным, не совсем непонятно, как не меняя элементы в строках отсортировать строки. Есть код, но это неверное решение, вывод не такой. Может стоит создать отдельный массив для сумм строк или можно без этого обойтись. Объясните, плз, как мне правильно сортировку провести? Мне больше бы понять логику работы кода, который должен в итоге получиться.

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
Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); int arr[][] = new int[n][m]; for (int i = 0; i  n; i++) { for (int j = 0; j  m; j++) { arr[i][j] = scanner.nextInt(); } } for (int i = 0; i  n; i++) { for (int j = 0; j  m; j++) { for (int k = 1; k  n; k++) { for (int s = 1; s  m; s++) { if (arr[k][s]  arr[i][j]) { int tmp = arr[i][j]; arr[i][j] = arr[k][s]; arr[k][s] = tmp; } } } } } for (int i = 0; i  n; i++) { for (int j = 0; j  m; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); }

Отсортировать строки двумерного массива по сумме четных элементов в порядке возрастания
Нет конкретики в задании по поводу расположение четное или же значение. Я пытаюсь сделать по.

Отсортировать строки массива в порядке возрастания суммы элементов строк
отсортировать строки массива в порядке возрастания суммы элементов строк Добавлено через 1.

Отсортировать строки матрицы в порядке возрастания суммы их элементов
Имеется задача, перескажу своими словами: матрица двухмерная, ввод с клавиатуры или случ.

Переставить столбцы двумерного массива в порядке возрастания элементов 2-й строки
Нужно написать 2 программы. НУ хотя бы одну. Буду ооочень признателен. Пожаааалуйста. .

Эксперт PythonЭксперт 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
package ru.ismokejc; public class Cyber { public static void main(String[] args) { int[][] matrix = { {3, 2, 0}, {1, 4, 2}, {5, 7, 1}, {1, 1, 1} }; new Cyber().sort(matrix); } private void sort(int[][] matrix) { int[] temp; boolean changed = true; while (changed) { for (int i = 0; i  matrix.length - 1; i++) { changed = false; if (rowSum(matrix[i]) > rowSum(matrix[i + 1])) { temp = matrix[i]; matrix[i] = matrix[i + 1]; matrix[i + 1] = temp; changed = true; break; } } } showMatrix(matrix); } private void showMatrix(int[][] matrix) { for (int[] row : matrix) { for (int elem : row) { System.out.print(elem + "\t"); } System.out.println(); } } private int rowSum(int[] row) { int sum = 0; for (int elem : row) { sum += elem; } return sum; } }

Лучший ответ

Сообщение было отмечено viViv как решение

Решение

ЦитатаСообщение от viViv Посмотреть сообщение

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
public static void main(String args[]) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); int arr[][] = new int[n][m]; for (int i = 0; i  n; i++) { for (int j = 0; j  m; j++) { arr[i][j] = scanner.nextInt(); } } for (int i = 0; i  n; i++) { for (int j = 0; j  m; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); } for (int i = 0; i  arr.length-1; i++) { for (int j = 0; j  arr.length-i-1; j++) { int sumArr1 = 0; int sumArr2 = 0; for(int a = 0; a  arr[j].length; a++) { sumArr1 += arr[j][a]; } for(int b = 0; b  arr[j+1].length; b++) { sumArr2 += arr[j+1][b]; } if (sumArr1 > sumArr2) { int[] temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } System.out.println(); for (int i = 0; i  n; i++) { for (int j = 0; j  m; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); } }

ЦитатаСообщение от viViv Посмотреть сообщение

Arrays.sort(arr, Comparator.comparingInt(a -> IntStream.of(a).sum()));

Tavashi, спасибо огромное. я не знала, как это реализовать таким образом, спасибо!

подскажите, пожалуйста, возможно глупый вопрос, но в чем же разница между:

for (int i = 0; i  arr.length; i++) { for (int j = 0; j  arr[i].length; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); }
for (int i = 0; i  n; i++) { for (int j = 0; j  m; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); }

В первом случае, всё проходит хорошо, а во втором TIME_LIMIT. Мне казалось, что это просто синтаксис и не влияет на время исполнения, но оказывается, что тоже имеет значение, где я могу более подробнее почитать и узнать об этом?

ЦитатаСообщение от viViv Посмотреть сообщение

Так сразу и не скажешь. Зависит от контекста. Приведите полный код, в котором происходит такая ошибка.

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
import java.util.Scanner; public class Program { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); int arr[][] = new int[n][m]; for (int i = 0; i  n; i++) { for (int j = 0; j  m; j++) { arr[i][j] = scanner.nextInt(); } } for (int i = 0; i  n - 1; i++) { for (int j = 0; j  n - i - 1; j++) { int sum1 = 0; int sum2 = 0; for (int k = 0; k  arr[j].length; k++) { sum1 += arr[j][k]; } for (int s = 0; s  arr[j + 1].length; s++) { sum2 += arr[j + 1][s]; } if (sum1 > sum2) { int[] tmp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = tmp; } } } for (int i = 0; i  arr.length; i++) { for (int j = 0; j  arr[i].length; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); } } }
for (int i = 0; i  n; i++) { for (int j = 0; j  m; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); }

Tavashi, тот же) у меня тоже ideа в двух случаях не выдает ошибку и работает одинаково, но я на платформе для обучения закидываю код этот, и там пишет TIME_LIMIT, подумала, что есть разница при выводе.

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
import java.util.Scanner; public class Program { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); int arr[][] = new int[n][m]; for (int i = 0; i  n; i++) { for (int j = 0; j  m; j++) { arr[i][j] = scanner.nextInt(); } } for (int i = 0; i  n - 1; i++) { for (int j = 0; j  n - i - 1; j++) { int sum1 = 0; int sum2 = 0; for (int k = 0; k  arr[j].length; k++) { sum1 += arr[j][k]; } for (int s = 0; s  arr[j + 1].length; s++) { sum2 += arr[j + 1][s]; } if (sum1 > sum2) { int[] tmp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = tmp; } } } for (int i = 0; i  n; i++) { for (int j = 0; j  m; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); } } }

viViv, это у вас, видимо, по условиям платформы он и не проходит. Есть улучшенный вариант пузырьковой сортировки. Вам ее предоставили в первом посте.

Tavashi, мне тут сказали, что это возможно платформа так захотела просто и повезло, что первый случай пропустила) idea то пропускает, так что вроде все ок)) а задачку еще надо будет переписывать без циклов с k и s внутри вроде как

viViv, помимо «отметки» о событии перестановки, добавил запоминание последнего места перестановки, чтобы цикл проходил не по всему массиву, а только до места перестановки. Должно быть быстрее:

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
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); int arr[][] = new int[n][m]; int[] sumByRow = new int[arr.length]; for (int i = 0; i  n; i++) { for (int j = 0; j  m; j++) { arr[i][j] = scanner.nextInt(); } } for (int i = 0; i  arr.length; i++) { for (int j = 0; j  arr[0].length; j++) { sumByRow[i] += arr[i][j]; } } int lastSwap = sumByRow.length; for (int j = 0; j  sumByRow.length; j++) { boolean noSwapped = true; int curSwap = -1; for (int i = 1; i  lastSwap; i++) { if(sumByRow[i-1] > sumByRow[i]) { noSwapped = false; int[] tempArr = arr[i-1]; arr[i-1] = arr[i]; arr[i] = tempArr; int tempSum = sumByRow[i-1]; sumByRow[i-1] = sumByRow[i]; sumByRow[i] = tempSum; curSwap = i; } } if (noSwapped) {break;} lastSwap = curSwap; } for (int i = 0; i  n; i++) { for (int j = 0; j  m; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); } }

Источник

Пузырьковая сортировка двумерного массива

Как-то подзабыл сортировку двумерного массива. Попросили нарисовать в примитивном виде. Посмотрел видео, где такой массив сортируется в C++. Но в 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
public class Sorting { public static void main(String[] args) { // TODO Auto-generated method stub int [][] array = {{4, 8, 7, 6, 6}, {3, 2, 6, 3, 2}, {12, 9, 1,7, 9}, {2, 4, 6, 4, 2}}; int n = 4; int m = 5; for (int i = 0; i  n; i++){ for (int j = 0; j  m; j++){ System.out.printf("%3d", array[i][j]); } System.out.println(); } int obmen = 0; for (int l=0; ln; ++l){ for (int k =0 ; km; ++k){ for (int i = 0; in; ++i){ for (int j = 0; jm; ++j){ if(array[l][k]  array[i][j]){ int t = array[i][j]; array[i][j] = array[l][k]; array[l][k] = t; obmen++; } } } } } System.out.println(); System.out.println(); for (int i = 0; i  n; i++){ for (int j = 0; j  m; j++){ System.out.printf("%3d", array[i][j]); } System.out.println(); } System.out.println(); System.out.println(obmen); } }

Пузырьковая сортировка двумерного массива
Задан 2-й массив. Требуется отсортировать каждую строку по убыванию.Сортировка пузырьковая должна.

Сортировка вставками или пузырьковая сортировка?
Здравствуйте! Подскажите пожалуйста, правильно ли что это код сортировки вставками или же это.

Сортировка двумерного массива
ребят, вот я создал двумерный массив, мне надо сортировать его либо выбором либо вставкой, не.

Сортировка двумерного массива
Всем привет! Помогите решить проблему, пожалуйста, у меня есть двумерный массив массивов.

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
package cyberforum; public class CyberForum { private static int [][] arrN_M = {{23,22,21,24}, {14,12,13,11}, {33,42,43,44}, {31,32,41,34},}; private static final int row = 4; private static final int colomn = 4; private static void bubbleSort(int [][] arrForSort) { int [] arrTmp = new int[row*colomn]; int indexTmp = 0; for (int i = 0; i  row; i++) { for (int j = 0; j  colomn; j++) arrTmp[indexTmp++] = arrForSort[i][j]; } for (int i = 0; i  arrTmp.length; i++) { for (int j = i; j  arrTmp.length; j++) { if (arrTmp[i] > arrTmp[j]) { int tmp = arrTmp[j]; arrTmp[j] = arrTmp[i]; arrTmp[i] = tmp; } } } indexTmp = 0; for (int i = 0; i  row; i++) { for (int j = 0; j  colomn; j++) arrForSort[i][j] = arrTmp[indexTmp++]; } } private static void printArr(int [][] arrPrn) { for (int i = 0; i  row; i++) { for (int j = 0; j  colomn; j++) System.out.print(arrPrn[i][j] + ","); System.out.println(); } } public static void main(String[] args) { System.out.println("Первоначальный массив:"); printArr(arrN_M); bubbleSort(arrN_M); System.out.println("После пузырьковой сортировки:"); printArr(arrN_M); } }
Первоначальный массив: 23,22,21,24, 14,12,13,11, 33,42,43,44, 31,32,41,34, После пузырьковой сортировки: 11,12,13,14, 21,22,23,24, 31,32,33,34, 41,42,43,44,

Источник

Читайте также:  background
Оцените статью