Java程式對二維陣列進行左對角線排序


對於給定的二維陣列,我們的任務是編寫一個 Java 程式來對其左對角線上的元素進行排序。對於此問題,我們需要以這樣一種方式排列陣列的元素,即從左上到右下(即陣列的左對角線)讀取時,值是有序的。

示例場景

Input: matrix = {3, 8, 2}, {6, 5, 4}, {3, 2, 1};
Output: new_matrix = {1, 4, 2}, {2, 3, 8}, {3, 6, 5}

使用以下排序工具來理解問題

排序工具 - 技術教學
4 9 8
2 2 7
6 5 5

二維陣列的左對角線升序排序

這裡的想法是找到對角線的長度,它是從起始點開始的剩餘行和列的最小值,並建立一個儲存對角線元素的陣列。然後,我們可以使用 Arrays.sort() 方法對該陣列進行排序,以獲取按升序排列的對角線元素。

示例

讓我們看看實際演示 -

import java.util.Arrays;

public class DgnlSortPrgrm {
   public static void main(String[] args) {
      int[][] twoDArr = {
         {3, 8, 2},
         {6, 5, 4},
         {3, 2, 1}
      };
      System.out.println("Matrix without sorting its diagonal::");
      printMatrix(twoDArr);
      // calling method to sort
      sorting(twoDArr);
      System.out.println("Matrix after sorting its diagonal::");
      printMatrix(twoDArr);
   }
   // method to sort diagonals
   public static void sorting(int[][] twoDArr) {
      int n = twoDArr.length;
      int m = twoDArr[0].length;

      // Sort diagonal that starts from the first row
      for (int col = 0; col < m; col++) {
         sortDgnlElem(twoDArr, 0, col);
      }

      // Sort diagonal that starts from the first column
      for (int row = 1; row < n; row++) {
         sortDgnlElem(twoDArr, row, 0);
      }
   }
   // method to sort elements of the diagonal
   private static void sortDgnlElem(int[][] twoDArr, int row, int col) {
      int n = twoDArr.length;
      int m = twoDArr[0].length;
      int len = Math.min(n - row, m - col);
      int[] dgnl = new int[len];

      // getting diagonal elements
      for (int i = 0; i < len; i++) {
         dgnl[i] = twoDArr[row + i][col + i];
      }

      // sorting diagonal elements
      Arrays.sort(dgnl);

      // sorted elements of the matrix
      for (int i = 0; i < len; i++) {
         twoDArr[row + i][col + i] = dgnl[i];
      }
   }
   // method to print the matrix
   private static void printMatrix(int[][] matrix) {
      for (int[] row : matrix) {
         for (int elem : row) {
            System.out.print(elem + " ");
         }
         System.out.println();
      }
   }
}

執行此程式碼後,您將獲得以下結果 -

Matrix without sorting its diagonal::
3 8 2 
6 5 4 
3 2 1 
Matrix after sorting its diagonal::
1 4 2 
2 3 8 
3 6 5  

二維陣列的左對角線降序排序

在這種方法中,我們遵循相同的邏輯,但進行了細微的更改。在這裡,我們首先對對角線的元素進行排序,然後反轉它們的順序。

示例

此 Java 程式演示瞭如何對二維陣列的左對角線進行降序排序。

import java.util.Arrays;

public class DgnlSortPrgrm {
   public static void main(String[] args) {
      int[][] twoDArr = {
         {3, 8, 2},
         {6, 5, 4},
         {3, 2, 1}
      };
      System.out.println("Matrix without sorting its diagonal::");
      printMatrix(twoDArr);
      // calling method to sort
      sorting(twoDArr);
      System.out.println("Matrix after sorting its diagonal::");
      printMatrix(twoDArr);
   }
   // method to sort diagonals
   public static void sorting(int[][] twoDArr) {
      int n = twoDArr.length;
      int m = twoDArr[0].length;

      // Sort diagonal that starts from the first row
      for (int col = 0; col < m; col++) {
         sortDgnlElem(twoDArr, 0, col);
      }

      // Sort diagonal that starts from the first column
      for (int row = 1; row < n; row++) {
         sortDgnlElem(twoDArr, row, 0);
      }
   }
   // method to sort elements of the diagonal
   private static void sortDgnlElem(int[][] twoDArr, int row, int col) {
      int n = twoDArr.length;
      int m = twoDArr[0].length;
      int len = Math.min(n - row, m - col);
      int[] dgnl = new int[len];

      // getting diagonal elements
      for (int i = 0; i < len; i++) {
         dgnl[i] = twoDArr[row + i][col + i];
      }

      // sorting diagonal elements
      Arrays.sort(dgnl);

      // reversing the sorted array for descending order
      for (int i = 0; i < len / 2; i++) {
         int temp = dgnl[i];
         dgnl[i] = dgnl[len - i - 1];
         dgnl[len - i - 1] = temp;
      }

      // sorted elements of the matrix
      for (int i = 0; i < len; i++) {
         twoDArr[row + i][col + i] = dgnl[i];
      }
   }
   // method to print the matrix
   private static void printMatrix(int[][] matrix) {
      for (int[] row : matrix) {
         for (int elem : row) {
            System.out.print(elem + " ");
         }
         System.out.println();
      }
   }
}

執行程式碼後,它將顯示以下輸出 -

Matrix without sorting its diagonal::
3 8 2 
6 5 4 
3 2 1 
Matrix after sorting its diagonal::
5 8 2 
6 3 4
3 2 1 

更新於: 2024年9月18日

568 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.