先上代碼
package Sort;
public class Matrix {
public static void main(String[] args) {
int[][] cc={{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1}};
int[][] e =new Matrix().multiMatrix(cc,cc);
for(int i=0;i<e.length;i++)
{
for(int j=0;j<e.length;j++)
System.out.print(e[i][j]+" ");
System.out.println();
}
}
int[][] multiMatrix(int[][] x,int[][] y)//矩陣的乘法
{
Matrix matr=new Matrix();
int a=x.length/2;
if(x.length==2)
{
int m1=(x[0][1]-x[1][1])*(y[1][0]+y[1][1]),
m2=(x[0][0]+x[1][1])*(y[0][0]+y[0][1]),
m3=(x[1][0]-x[0][0])*(y[0][0]+y[0][1]),
m4=(x[0][0]+x[0][1])*y[1][1],
m5=x[0][0]*(y[0][1]-y[1][1]),
m6=x[1][1]*(y[1][0]-y[0][0]),
m7=(x[1][0]+x[1][1])*y[0][0];
int[][] c=new int[2][2];
c[0][0]=m1+m2+m6-m4;
c[0][1]=m4+m5;
c[1][0]=m6+m7;
c[1][1]=m2+m3+m5-m7;
return c;
}
else
{
int[][] a11=new Matrix().sepaMatr(x, 0, 0);
int[][] a12=new Matrix().sepaMatr(x, 0, a);
int[][] a21=new Matrix().sepaMatr(x, a, 0);
int[][] a22=new Matrix().sepaMatr(x, a, a);
int[][] b11=new Matrix().sepaMatr(y, 0, 0);
int[][] b12=new Matrix().sepaMatr(y, 0, a);
int[][] b21=new Matrix().sepaMatr(y, a, 0);
int[][] b22=new Matrix().sepaMatr(y, a, a);
int[][] m1=matr.multiMatrix(matr.operaMatr(a11,a22,'-'),matr.operaMatr(b21,b22,'+')),
m2=matr.multiMatrix(matr.operaMatr(a11, a22, '+'), matr.operaMatr(b11, b22, '+')),
m3=matr.multiMatrix(matr.operaMatr(a21, a11, '-'),matr.operaMatr(b11, b12,'+')),
m4=matr.multiMatrix(matr.operaMatr(a12, a11, '+'), b22),
m5=matr.multiMatrix(a11,matr.operaMatr(b12, b22,'-')),
m6=matr.multiMatrix(a22, matr.operaMatr(b21, b11, '-')),
m7=matr.multiMatrix(matr.operaMatr(a21, a22, '+'), b11);
int[][] c11=matr.operaMatr(matr.operaMatr(m6, m4, '-'),matr.operaMatr(m1, m2, '+'),'+');
int[][] c12=matr.operaMatr(m4, m5, '+');
int[][] c21=matr.operaMatr(m6, m7, '+');
int[][] c22=matr.operaMatr(matr.operaMatr(m2, m3, '+'),matr.operaMatr(m5, m7, '-'),'+');
return matr.mergMatr(c11, c12, c21, c22);
}
}
int[][] mergMatr(int[][] x11,int[][] x12,int[][] x21,int[][] x22 )//和並舉證,將c11,c12,c21,c22合併成一個矩陣
{
int[][] a=new int[2*x11.length][2*x11.length];
for(int i=0;i<x11.length;i++)
for(int j=0;j<x11.length;j++)
{
a[i][j]=x11[i][j];
}
for(int i=0;i<x11.length;i++)
for(int j=0;j<x11.length;j++)
{
a[i][j+x11.length]=x12[i][j];
}
for(int i=0;i<x11.length;i++)
for(int j=0;j<x11.length;j++)
{
a[i+x11.length][j]=x21[i][j];
}
for(int i=0;i<x11.length;i++)
for(int j=0;j<x11.length;j++)
{
a[i+x11.length][j+x11.length]=x22[i][j];
}
return a;
}
int[][] sepaMatr(int[][] x,int m,int n)//分解矩陣成矩陣塊
{
int[][] a=new int[x.length/2][x.length/2];
for(int i=0;i<a.length;i++)
for(int j=0;j<a.length;j++)
{
a[i][j]=x[m+i][n+j];
}
return a;
}
int[][] operaMatr(int[][] x,int[][] y,char f)//矩陣的加減
{
if(f=='+')
{
int[][] a=new int[x.length][x.length];
for(int i=0;i<x.length;i++)
for(int j=0;j<x.length;j++)
a[i][j]=x[i][j]+y[i][j];
return a;
}
else if(f=='-')
{
int[][] a=new int[x.length][x.length];
for(int i=0;i<x.length;i++)
for(int j=0;j<x.length;j++)
a[i][j]=x[i][j]-y[i][j];
return a;
}
else
{
System.out.println("error");
int[][] a=new int[1][1];
return a;
}
}
}
其中的矩陣乘法這一塊還有很大的改進。等我改好了到時候再傳上來。
當n>36時,斯特拉森法相比於普通方法能節省很多時間
。。。。我是爲了練習遞歸才寫這個的,遞歸好難啊。。。。可是寫出來再看卻覺得自己爲什麼這麼笨。。。