1. 程式人生 > >第十節:演算法、常見演算法模板

第十節:演算法、常見演算法模板

1.什麼是演算法 演算法,一般有5個特徵:有窮性、確切性、輸入、輸出、可行性 2.演算法的分類 按照演算法的應用來分:演算法可以分為基本演算法、幾何演算法、加密/解密演算法、查詢演算法、圖示資料分析演算法等。 按照演算法的思路來分:演算法可以分為遞推演算法、遞迴演算法、窮舉演算法、分治演算法等。 3.Java常用的排序演算法實現原理以及程式碼實現 /** * 交換陣列元素 * @param arr * @param a * @param b */ public static void swap(int []arr,int a,int b){ arr[a] = arr[a]+arr[b]; arr[b] = arr[a]-arr[b]; arr[a] = arr[a]-arr[b]; }

1.插入排序 插入排序(Straight Insertion Sorting)的基本思想:在要排序的一組數中,假設前面(n-1) [n>=2] 個數已經是排好順序的,現在要把第n個數插到前面的有序數中,使得這n個數也是排好順序的。如此反覆迴圈,直到全部排好順序。

public static void insertionSort(int[] arr) {
    for (int i = 1; i < arr.length; i++) {
        int j = i;
        while (j > 0 && arr[j] < arr[j - 1]) {
            swap(arr,j,j-1);
            j--;
        }
    }
}

2.選擇排序 遍歷整個序列,將最小的數放在最前面。遍歷剩下的序列,將最小的數放在最前面。重複第二步,直到只剩下一個數。 public static void selectSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { int min = i; for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[min]) { min = j; } } if (min != i) { swap(arr,min,i); } } }

4.氣泡排序 將序列中所有元素兩兩比較,將最大的放在最後面。將剩餘序列中所有元素兩兩比較,將最大的放在最後面。重複第二步,直到只剩下一個數。 public static void bubbleSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { swap(arr,j,j+1); } }

    }
}

4.遞迴演算法 遞迴,就是在執行的過程中呼叫自己。遞迴必須要有三個要素: ①、邊界條件 ②、遞迴前進段 ③、遞迴返回段 當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。

(1). 階乘 public static long f(int n){ if(n == 1) // 遞迴終止條件 return 1; // 簡單情景

    return n*f(n-1);  // 相同重複邏輯,縮小問題的規模
}

(2).斐波納契數列

public static int fibonacci(int n) { if (n == 1 || n == 2) { // 遞迴終止條件 return 1; // 簡單情景 } return fibonacci(n - 1) + fibonacci(n - 2); // 相同重複邏輯,縮小問題的規模 }

(3)楊輝三角的取值

public static int getValue(int x, int y) { if(y <= x && y >= 0){ if(y == 0 || x == y){ // 遞迴終止條件 return 1; }else{ // 遞迴呼叫,縮小問題的規模 return getValue(x-1, y-1) + getValue(x-1, y); } } return -1; } (4)漢諾塔問題 public static void moveDish(int level, char from, char inter, char to) { if (level == 1) { // 遞迴終止條件 System.out.println(“從” + from + " 移動盤子" + level + " 號到" + to); } else { moveDish(level - 1, from, to, inter); // 遞迴呼叫,縮小問題的規模 System.out.println(“從” + from + " 移動盤子" + level + " 號到" + to); moveDish(level - 1, inter, from, to); // 遞迴呼叫,縮小問題的規模 } }