常見的演算法
阿新 • • 發佈:2020-11-27
1. 說明
這裡的演算法主要是自己這段時間為了面試複習而記錄的,只符合自己的閱讀習慣,且只是用程式碼實現了一下,並沒有詳細的原理介紹。
2. 常見的演算法
面試時要會寫如下五種常見的演算法
a.氣泡排序
b.快速排序(冒泡改進版)
c.選擇排序
d.直接插入排序
e.希爾排序(直接插入排序改進版)
3. 程式碼實現
/** * 1.氣泡排序 對比的次數是N-1次,兩兩比較,將最大的是挪到最後 經過N次排序,最後的N個數是有序的 * 要點:1.識別符號,如果第一次沒有變化,則是有序的 2.排序的次數length-1 3.第i次比較的範圍 0到length-i(i從1開始) * * @param array 待排序的陣列 * @return 排好序的陣列 */ public int[] bubbleSort(int[] array) { for (int i = 1; i < array.length; i++) { for (int j = 0; j < array.length - i; j++) { if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } System.out.println("冒泡第" + i + "次排序的結果為"); display(array); } return array; } /** * 2.選擇排序 需要N-1輪比較 每一次都是講最小的數選擇出來,插入到當前需要排序的位置 * 要點:1.比較的輪數 len -1 2.每一輪待插入元素的位置 3.比較,如果該位置不是最小的數值,將最小的數和待排序的數對調 * * @param array 待排序的陣列 * @return 已經排好序的陣列 */ public int[] choiceSort(int[] array) { for (int i = 0; i < array.length - 1; i++) { int min = i; for (int j = i + 1; j < array.length; j++) { if (array[j] < array[min]) { min = j; } if (i != min) { int temp = array[i]; array[i] = array[min]; array[min] = temp; } } System.out.println("選擇第" + i + "次排序的結果為"); display(array); } return array; } /** * 3.直接插入排序 * 要點:首先要選擇好待排序的那個數,在while迴圈中參與比較的數是temp,待比較的數 * * @param array 倒排序的陣列 * @return 排好序的陣列 */ public int[] straightInsert(int[] array) { for (int i = 0; i < array.length - 1; i++) { int j = i + 1; int temp = array[j]; while (j > 0 && temp < array[j - 1]) { array[j] = array[j - 1]; j--; } array[j] = temp; System.out.println("直接插入第" + i + "次排序的結果為"); display(array); } return array; } /** * 4.快速排序-氣泡排序的改進版,原理是選擇一個基準位,每一次元陣列分成兩部分,一部分比基準數大,另一部分比基準數小 * 注意:這個是簡單版的快速排序,直接選擇第一個數為基準數 * 以下例子利用了分治演算法的快速排序,選擇一個目標數字,將待排序的陣列分成兩個, * 一部分都比這個數字大,一部分都比這個數字小 * <p> * <p> * 減少氣泡排序過程中比較的次數 */ public void quickSort(int[] arr, int low, int high) { int i, j, base, temp; if (low > high) { return; } i = low; j = high; //base是基準位,選擇第一個數字為基準位 base = arr[low]; while (i < j) { //先看右邊,依次往左遞減 while (base <= arr[j] && i < j) { j--; } //再看左邊,依次往右遞增 while (base >= arr[i] && i < j) { i++; } //如果條件滿足則交換 if (i < j) { temp = arr[j]; arr[j] = arr[i]; arr[i] = temp; } } //最後將基準與i和j相等位置的數字調換,因為在上述交換的過程中,base上的資料肯定是不變的,也就是arr[low]不變 arr[low] = arr[i]; arr[i] = base; //遞迴呼叫左半邊 quickSort(arr, low, j - 1); //遞迴呼叫右半邊,因為數字J在的位置已經是有序的,所以不再參與排序 quickSort(arr, j + 1, high); } /** * 2h的shell排序,是直接插入排序的改進,希爾排序通過加大插入排序中元素的間隔,並在這些有間隔的元素中進行插入排序,從而使資料項能夠大跨度的移動。 * * @param array */ public void shellSortFor2h(int[] array) { int step; int len = array.length; for (step = len / 2; step > 0; step /= 2) { for (int i = step; i < len; i++) { int j = i; int temp = array[j]; if (array[j] < array[j - step]) { while (j - step >= 0 && temp < array[j - step]) { array[j] = array[j - step]; j -= step; } array[j] = temp; } } } } //遍歷顯示陣列 public static void display(int[] array) { for (int i = 0; i < array.length; i++) { System.out.print(array[i] + " "); } System.out.println(); } public static void main(String[] args) { AlgorithmInteview algorithmInteview = new AlgorithmInteview(); int[] array = {9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 0}; //未排序陣列順序為 System.out.println("未排序陣列順序為:"); display(array); System.out.println("-----------------------"); algorithmInteview.straightInsert(array); System.out.println("-----------------------"); System.out.println("經過排序後的陣列順序為:"); display(array); }