1. 程式人生 > 其它 >斐波拉契數列、氣泡排序、轉置矩陣、楊輝三角、陣列反轉(Java語言描述)

斐波拉契數列、氣泡排序、轉置矩陣、楊輝三角、陣列反轉(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