Advertisement
Guest User

SnailSortMatrix

a guest
Dec 12th, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.61 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.*;
  5.  
  6. import static java.lang.Integer.*;
  7.  
  8. public class Main {
  9.  
  10. public static void main(String[] args) throws IOException {
  11.  
  12. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  13.  
  14. System.out.print("Rows: ");
  15. int rows = Integer.parseInt(br.readLine());
  16.  
  17. System.out.print("Cols: ");
  18. int cols = Integer.parseInt(br.readLine());
  19.  
  20. int[][] matrix = readMatrix(rows, cols, br);
  21.  
  22. snailSort(matrix);
  23.  
  24. System.out.println();
  25. System.out.println("After snail sort: ");
  26. printMatrix(matrix);
  27. }
  28.  
  29. private static void printMatrix(int[][] matrix)
  30. {
  31. for (int[] row: matrix)
  32. {
  33. for (int i : row)
  34. {
  35. System.out.print(i + " ");
  36. }
  37.  
  38. System.out.println();
  39. }
  40. }
  41.  
  42. private static void snailSort(int[][] matrix)
  43. {
  44. List<Integer> nums = getSortedMatrixNums(matrix);
  45.  
  46. int rightRowIndex = 0;
  47.  
  48. while (true)
  49. {
  50. moveRight(matrix, nums, rightRowIndex);
  51. if (nums.isEmpty()) break;
  52.  
  53. moveDown(matrix, nums, rightRowIndex);
  54. if (nums.isEmpty()) break;
  55.  
  56. moveLeft(matrix, nums, rightRowIndex);
  57. if (nums.isEmpty()) break;
  58.  
  59. moveUp(matrix, nums, rightRowIndex);
  60. if (nums.isEmpty()) break;
  61.  
  62. ++rightRowIndex;
  63. }
  64. }
  65.  
  66. private static void moveUp(int[][] matrix, List<Integer> nums, int rightRowIndex)
  67. {
  68. int row = matrix.length - 2 - rightRowIndex;
  69.  
  70. while (row > rightRowIndex)
  71. {
  72. matrix[row][rightRowIndex] = nums.remove(0);
  73. --row;
  74. }
  75. }
  76.  
  77. private static void moveLeft(int[][] matrix, List<Integer> nums, int rightRowIndex)
  78. {
  79. int col = matrix[0].length - 2 - rightRowIndex;
  80. int row = matrix.length - 1 - rightRowIndex;
  81.  
  82. while (col >= rightRowIndex)
  83. {
  84. matrix[row][col] = nums.remove(0);
  85. --col;
  86. }
  87. }
  88.  
  89. private static void moveDown(int[][] matrix, List<Integer> nums, int rightRowIndex)
  90. {
  91. int col = matrix[0].length - 1 - rightRowIndex;
  92. int row = rightRowIndex + 1;
  93.  
  94. while (row < matrix.length - rightRowIndex)
  95. {
  96. matrix[row++][col] = nums.remove(0);
  97. }
  98. }
  99.  
  100. private static void moveRight(int[][] matrix, List<Integer> nums, int rightRowIndex)
  101. {
  102. for (int col = rightRowIndex; col < matrix[0].length - rightRowIndex; ++col)
  103. {
  104. matrix[rightRowIndex][col] = nums.remove(0);
  105. }
  106. }
  107.  
  108. private static List<Integer> getSortedMatrixNums(int[][] matrix)
  109. {
  110. List<Integer> nums = new ArrayList<>();
  111.  
  112. for (int[] ints : matrix)
  113. {
  114. Arrays.stream(ints, 0, matrix[0].length)
  115. .forEach(nums::add);
  116. }
  117.  
  118. Collections.sort(nums);
  119. return nums;
  120. }
  121.  
  122. private static int[][] readMatrix(int rows, int cols, BufferedReader br) throws IOException
  123. {
  124. int[][] matrix = new int[rows][cols];
  125.  
  126. Random rand = new Random();
  127.  
  128. for (int i = 0; i < matrix.length; ++i)
  129. {
  130. for (int j = 0; j < matrix[0].length; ++j)
  131. {
  132. //Generate random number in range [-10 - 150]
  133. matrix[i][j] = rand.nextInt(150 + 10 + 1 -10);
  134. }
  135. }
  136. return matrix;
  137. }
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement