構造サイクロトロン行列


タイトル:N*N配列を内旋または外旋で並べ替える

  
  
  
  
  1. import java.util.Arrays;  
  2. public class Sort {  
  3.     public static void main(String[] args){  
  4.         int[][] array =   
  5.             {{12,2,118,17},   
  6.              {1,1339,18},  
  7.              {4,10,167,19},  
  8.              {5,15,146,20},  
  9.              {25,23,24,21,22}};  
  10.         boolean isClockwise = false;//  
  11.         ringSort(array, isClockwise);     
  12.         print(array);     
  13.     }  
  14.       
  15.     private static int[][] orientsClockwise = {{0,1},{1,0},{0,-1},{-1,0}};  
  16.     //private static int[][] orientsUnClockwise = {{1,0},{0,1},{-1,0},{0,-1}};  
  17.       
  18.     private static int[][] ringSort(int[][] array, boolean isClockwise) {  
  19.         boolean out2in = true;//  
  20.         int[] one = pase2array(array);  
  21.         empty(array);  
  22.         if(out2in){  
  23.             Arrays.sort(one);  
  24.         }else{  
  25.             Arrays.sort(one);  
  26.             for (int i = 0; i < one.length/2; i++) {  
  27.                 one[i] = one[i]^ one[one.length-1-i];  
  28.                 one[one.length-1-i] =  one[i]^one[one.length-1-i];  
  29.                 one[i] = one[i]^one[one.length-1-i];  
  30.             }  
  31.         }  
  32.           
  33.         print(one);  
  34.         //   
  35.         int curOrient = 0;  
  36.         int i = 0, j = 0;  
  37.         for (int k = 0; k < one.length; k++) {  
  38.             array[i][j] = one[k];  
  39.             int[] newdir = nextOrient(curOrient, array, i, j);            
  40.             i = newdir[0];  
  41.             j = newdir[1];  
  42.             curOrient = newdir[2];  
  43.         }     
  44.         return array;  
  45.           
  46.     }  
  47.  
  48.     private static int[] nextOrient(int curOrient, int[][] array, int i, int j) {             
  49.         int nextOrient = curOrient;  
  50.         int row = array.length;  
  51.         int column = array[0].length;  
  52.         int ii = i + orientsClockwise[curOrient][0];  
  53.         int jj = j + orientsClockwise[curOrient][1];  
  54.         if(ii==row||ii==-1||jj==-1||jj==column||array[ii][jj]!=0){  
  55.             nextOrient =++nextOrient%4;  
  56.         }  
  57.         i += orientsClockwise[nextOrient][0];  
  58.         j += orientsClockwise[nextOrient][1];  
  59.  
  60.         System.out.println(i+" "+j);  
  61.           
  62.         int[] newdir = {i,j,nextOrient};  
  63.         return newdir;  
  64.     }  
  65. }