演算法之選擇、冒泡、插入排序
阿新 • • 發佈:2021-06-18
1、選擇演算法
選擇演算法的最好時間複雜度是:O(N^2),最差的時間複雜度是O(N^2),平均時間複雜度為O(N^2),由於是不穩定演算法,在工程上是很少使用。
public int[] selectSort(int[] sourceArray) throws Exception { int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); // 總共要經過 N-1 輪比較 for (int i = 0; i < arr.length - 1; i++) {int min = i; // 每輪需要比較的次數 N-i for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[min]) { // 記錄目前能找到的最小值元素的下標 min = j; } } // 將找到的最小值和i位置所在的值進行交換 if (i != min) {int tmp = arr[i]; arr[i] = arr[min]; arr[min] = tmp; } } return arr; }
2、氣泡排序
冒泡演算法的最好時間複雜度是:O(N),最差的時間複雜度是O(N^2),平均時間複雜度為O(N^2),是穩定演算法但是比較慢,所以在工程上也是很少使用。
public int[] bubbleSort(int[] sourceArray){ // 對 arr 進行拷貝,不改變引數內容 int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); for (int i = 1; i < arr.length; i++) { // 設定一個標記,若為true,則表示此次迴圈沒有進行交換,也就是待排序列已經有序,排序已經完成。 boolean flag = true; for (int j = 0; j < arr.length - i; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; flag = false; } } if (flag) { break; } } return arr; }
3、插入排序
插入演算法的最好時間複雜度是:O(N),最差的時間複雜度是O(N^2),平均時間複雜度為O(N^2),是穩定演算法,在樣本小且基本有序的時候效率比較高。
public int[] insertSort(int[] sourceArray) { // 對 arr 進行拷貝,不改變引數內容 int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); // 從下標為1的元素開始選擇合適的位置插入,因為下標為0的只有一個元素,預設是有序的 for (int i = 1; i < arr.length; i++) { // 記錄要插入的資料 int tmp = arr[i]; // 從已經排序的序列最右邊的開始比較,找到比其小的數 int j = i; while (j > 0 && tmp < arr[j - 1]) { arr[j] = arr[j - 1]; j--; } // 存在比其小的數,插入 if (j != i) { arr[j] = tmp; } } return arr; }