1. 程式人生 > 其它 >演算法之選擇、冒泡、插入排序

演算法之選擇、冒泡、插入排序

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;
    }