斐波拉契数列、冒泡排序、转置矩阵、杨辉三角、数组反转、插入排序(Java语言描述)


斐波拉契数列、冒泡排序、转置矩阵、杨辉三角、数组反转、插入排序(Java语言描述)

一、斐波拉契数列

public  class Fibonacci {
   public static void main(String[] args) {
       int n,i;
       java.util.Scanner in = new java.util.Scanner(System.in);
       n = in.nextInt();   //由用户决定打印 n 个数
       while(n<0) n = in.nextInt();    //n不能为负数
       int[] arr = new int[n];
       if(n>2){
           arr[0] = arr[1] = 1;    //前两位是1
           for(i=2;i<n;i++)
               arr[i] = arr[i-2] + arr[i-1];   //当前的数为前两个数之和
      }
       else if(n == 1) arr[0] = 1;
       else if(n == 2) arr[0] = arr[1] = 1;
       
       for(i=0;i<n;i++) {
           if(i%5==0)  //五个数换一行
               System.out.println();
           System.out.print(arr[i] + "\t");
      }
  }
}

输入:

10

输出:

 

1 1 2 3 5

8 13 21 34 55

二、冒泡排序

很经典的排序了,这张图很形象:

冒泡排序

(图片来自冒泡排序(超详细)hcz666的博客-CSDN博客冒泡排序

代码如下

public class BubbleSort {
   public static void main(String[] args) {
       int[] a = {9,8,7,6,5,4,3,2,1,0};
       int i,j;
       //n个数字只用比较n-1轮
       for(i=0;i<9;i++) {
           //每比较一轮就有一个数字排好了,所以只用比较9-i次
           for(j=0;j<9-i;j++) {
               if(a[j] > a[j+1]) {
                    //交换值
                   int t = a[j];
                   a[j] = a[j+1];
                   a[j+1] = t;
              }
          }
      }
       //输出
       for(i=0;i<10;i++)
           System.out.println(a[i]);
  }
}

输出:

0

1

2

3

4

5

6

7

8

9

 

三、转置矩阵

a[0][0]a[0][1]a[0][2]
1 2 3
a[1][0] a[1][1] a[1][2]
4 5 6
a[2][0] a[2][1] a[2][2]
7 8 9

 

正对角线的两边的值交换后

 

a[0][0]a[0][1]a[0][2]
1 4 7
a[1][0] a[1][1] a[1][2]
2 5 8
a[2][0] a[2][1] a[2][2]
3 6 9

 

代码如下

public class Transpose2 {
   public static void main(String[] args) {
       java.util.Scanner in = new java.util.Scanner(System.in);
       int[][] a = new int[3][3];  //假如有一个3*3的矩阵
       int i,j;                    //分别控制行和列
       for(i=0;i<3;i++) {
           for(j=0;j<3;j++) {
               a[i][j] = in.nextInt();
          }
      }
       //转置
       for(i=0;i<3;i++) {
           for(j=0;j<3;j++) {
                //将对角线两边值交换
               if(j>i) {
               int t = a[i][j];
               a[i][j] = a[j][i];
               a[j][i] = t;
              }
          }
      }
       //输出看效果
       for(i=0;i<3;i++) {
           for(j=0;j<3;j++)
               System.out.print(a[i][j] + " ");
           System.out.println();
      }
  }
}

输入:

1 2 3

4 5 6

7 8 9

输出:

1 4 7

2 5 8

3 6 9

 

还有一种方法,更简单,但空间复杂度高一些,时间和空间不能兼得嘛。

建立一个新的数组接受转置后的数组。

代码如下:

public class Transpose {
   public static void main(String[] args) {
       java.util.Scanner in = new java.util.Scanner(System.in);
       int[][] a = new int[3][3];  //假如有一个3*3的矩阵
       int[][] b = new int[3][3];  //存放转置后的矩阵
       int i,j;                    //分别控制行和列
       for(i=0;i<3;i++) {
           for(j=0;j<3;j++) {
               a[i][j] = in.nextInt();
          }
      }
        //转置
       for(i=0;i<3;i++) {
           for(j=0;j<3;j++) {
               b[i][j] = a[j][i];
          }
      }
       //输出看效果
       for(i=0;i<3;i++) {
           for(j=0;j<3;j++)
               System.out.print(b[i][j] + " ");
           System.out.println();
      }
  }
}

输入:

1 2 3

4 5 6

7 8 9

输出:

1 4 7

2 5 8

3 6 9

 

四、杨辉三角

简易版的杨辉三角

代码如下:

public class YangHui {
   public static void main(String[] args) {
       int[][] a = new int[10][10];    //打印十行
       int i,j;                        
       for(i=0;i<10;i++) {
           //初始化两腰为 1
           a[i][0] = 1;
           a[i][i] = 1;
           for(j=1;j<i;j++) {
               a[i][j] = a[i-1][j-1] + a[i-1][j];
          }
      }
       
       for(i=0;i<10;i++) {
           for(j=0;j<=i;j++) {
               System.out.printf("%-4d ",a[i][j]);
          }
           System.out.println();
      }
?
  }
}

输出:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

1 7 21 35 35 21 7 1

1 8 28 56 70 56 28 8 1

1 9 36 84 126 126 84 36 9 1

 

五、数组反转

两种方法

  1. 以数组中心为轴翻转:

public class Turn {
   public static void main(String[] args) {
       int[] a = {0,1,2,3,4,5,6,7,8,9};
       int i;
       for(i=0;i<a.length/2;i++) {
           int t = a[i];
           a[i] = a[9-i];
           a[9-i] = t;
      }
?
       for(i=0;i<a.length;i++)
           System.out.print(a[i] + " ");
?
  }
}

输出:

9 8 7 6 5 4 3 2 1 0

  1. 利用新数组(和转置矩阵那里一样):

public class Turn2 {
   public static void main(String[] args) {
       int[] a = {0,1,2,3,4,5,6,7,8,9};
       int[] b = new int[a.length];
       int i;
?
       for(i=0;i<a.length;i++) {
           b[i] = a[a.length-1-i];//数组下标从0开始,小心越界
      }
?
       for(i=0;i<b.length;i++)
           System.out.print(b[i] + " ");
  }
}

输出:

9 8 7 6 5 4 3 2 1 0

 

六、插入排序

也是很经典的算法

图看明白了代码也就不难理解了:

选择排序

代码如下:

import java.util.Scanner;
?
class Sort {
   public static void main(String[] args) {
       int MAX = 10;
       int[] a = new int[MAX];
       int length,n,i;
       Scanner in = new Scanner(System.in);
       length = in.nextInt();
       for(n=0;n<length;n++)
           a[n] = in.nextInt();
       for(n=1;n<length;n++) {
           int p = a[n];
           for(i=n-1;i>=0 && p<a[i];i--)
               a[i+1] = a[i];
           a[i+1] = p;
      }
       for(n=0;n<length;n++) {
           System.out.print(a[n] + " ");
      }        
  }
}

输入:

10

9 8 7 6 5 4 3 2 1 0

输出:

0 1 2 3 4 5 6 7 8 9

相关